月度归档: 2021 年 3 月

Python 下载图片的三种方法

Python 下载图片的三种方法

import os
os.makedirs(‘./image/’, exist_ok=True)
IMAGE_URL = “http://image.nationalgeographic.com.cn/2017/1122/20171122113404332.jpg”

def urllib_download():
from urllib.request import urlretrieve
urlretrieve(IMAGE_URL, ‘./image/img1.png’)

def request_download():
import requests
r = requests.get(IMAGE_URL)
with open(‘./image/img2.png’, ‘wb’) as f:
f.write(r.content)

def chunk_download():
import requests
r = requests.get(IMAGE_URL, stream=True)
with open(‘./image/img3.png’, ‘wb’) as f:
for chunk in r.iter_content(chunk_size=32):
f.write(chunk)

urllib_download()
print(‘download img1’)
request_download()
print(‘download img2’)
chunk_download()
print(‘download img3’)

Python下载图片到指定文件目录

Python下载图片到指定文件目录

import urllib.request
import os

url = “https://avatar.csdnimg.cn/9/7/A/2_zhangphil.jpg” #图片路径。
dir = os.getcwd(); #当前工作目录。
urllib.request.urlretrieve(url, dir + ‘\\result.jpeg’) #下载图片。

怎么把旧服务器里的数据转移到新服务器

如果基于更高性能、更灵活扩展或供应商更换需求,您可能需要将现有在线项目进行迁移。那么,您需要解决的因素包括现有数据、结构、配置等。通过必要的技术,适当的规划和特定软件,您只需将所需数据传输到新服务器即可。数据迁移过程中的复杂性与项目的复杂性和规模息息相关。作为值得信赖的香港服务器租用托管服务商,稳网互联小编将向您简单展示服务器数据迁移时应注意的事项。
将数据迁移到新服务器之前 – 正确规划
选择合适的目标服务器是*步。例如,如果您计划更改网站/应用程序,那么您将需要执行其他任务,以便在重定位期间不必处理这些任务。无论是将数据从一台服务器(例如香港服务器)迁移到另一个服务器,还是新服务器结构是基于集群还是涉及多个不同的系统,这也会有所不同。
更改服务器体系结构时,必须更改配置,无论是不同的操作系统,不同的软件版本还是不同的控制面板。即使您只是切换到相同类型的更强大的服务器,您仍然需要相应地配置应用程序和服务,以便您可以利用额外的内存,改进的CPU性能或增加的内存容量。
请注意,无论您选择简单的性能升级还是完全更改服务器架构,您都应该提前为移动创建*佳条件。这些因素包括足够的存储空间和计算能力以及30%到40%的缓冲区或详细的扩展计划以及快速网络连接。
何时将数据迁移到另一台服务器?
如果您租用服务器资源,则可能不会完全考虑相应托管服务的成本。来自提供商的各种软件包在提供内容方面有所不同,即可用性、数据安全性和支持。因此,在选择前比较不同的包是必要的。迁移数据的另一个原因可能是您希望减轻IT部门的压力。在这种情况下,IT托管服务解决方案将是一个不错的选择。它不仅托管服务器,而且由提供商维护和更新。例如,使用稳网互联香港服务器租用服务,可以选择不同级别的技术服务包,以便简化您的 IT管理工作内容。
为即将进行的迁移整理当前服务器
为了使新服务器的配置和引入尽可能简单,整理您当前使用的服务器是必要的。因此,数据迁移是删除任何冗余或过期页面、备份、电子邮件和用户帐户的*佳时间。这意味着您将传输的数据量减少到*小,另一方面,您可以从目标系统上的所需资源中获得更大的价值。
此外,您应该为关闭活动服务器进程制定准确的计划,以便以后不会出现数据丢失导致的复杂情况。指定应停止对文件、脚本和配置所做的任何更改的时间,并尽可能临时阻止对数据库的访问。也可以稍后更新您的数据库。在大多数情况下,数据传输是通过完整的服务器备份进行的。

数据迁移如何为服务器工作?
迁移数据的*简单方法是使用实际状态的一对一备份副本。在进行必要的配置和调整之前,将其传输到新的服务器硬件,然后您可以测试它是否有效。*后,您可以调整DNS或IP设置,这将允许您在新系统上实时启动Web项目。虽然这种方法通常需要系统管理员的支持,但它很容易规划和执行。但是,这意味着当前服务器将完全暂停,您将无法在数据迁移期间访问或使用您的网站。
如果您提供需要持续数据库访问的服务,则需要一个混合迁移解决方案,以使当前服务器保持活动状态。在这种情况下,您应该将服务器上的当前数据库声明为“master”,然后在配置完成后将新数据库从属于“slave”。这使两个应用程序能够实时同步。如果两个数据库处于相同状态,请反转角色以使新数据库成为主数据库。这意味着您的项目可以在数据迁移期间继续可用。
哪些资源可用于数据迁移到新服务器?
有几种工具和服务可以简化服务器迁移。例如,如果您只想移动数据而无需调整操作系统或其他软件,则不应放弃控制面板。这些服务器管理程序可帮助您创建数据备份,然后将其迁移到新服务器。所需的配置工作量很小。诸如WordPress之类的内容管理系统也可以使用简单的FTP和备份应用程序进行传输,并且通常提供自己的插件来迁移链接数据库。这些过程大部分都是自动化的。
对于更复杂的项目,root权限总是会带来好处:通过SSH,您可以通过相应的命令行将完整的数据库(包括所有权限和用户数据)传输到新服务器。例如,您可以使用MySQLdump将MySQL数据库作为副本发送到目标系统。作为Microsoft SQL Server用户,您甚至可以使用内置函数来实现此目的。
但是,您也可以外包服务器数据的迁移:许多托管服务提供商不仅为客户提供手动执行服务器数据传输的特定软件,还提供主动支持数据迁移的服务。此外,还有一些服务专门用于Web项目的迁移并提供全天候服务 – 无论是从一个共享服务器到另一个共享服务器的简单切换,您是在更换提供商,还是计划切换到服务器集群。

服务器迁移期间可能出现哪些问题?
需要持续稳定的网络连接以根据需要传输服务器数据。因此,在服务器迁移期间,连接问题是*常见的错误来源。如果连接断开,它可以完全终止传输,这意味着它从一开始就重新启动。但是,短期连接问题通常不会被注意到,并且不会导致进程终止。但是,在某些情况下,并非所有数据都可以到达目标服务器,这反过来又会影响迁移的应用程序的功能。
但是,如果某些文件无法成功传输到新服务器,则可能有几个原因。特别是当更改操作系统并且不再支持某些文件格式、编程语言等时,会出现兼容性问题。此外,源计算机和目标计算机上的不同访问权限或密码保护可能导致复杂化。此外,如果目标系统没有所需的磁盘空间或DNS条目未正确更改,则数据迁移可能会导致错误。
服务器数据迁移需要检查这些事项
将项目移动到新服务器可能是一个复杂而繁琐的过程,具体取决于项目的大小和新目标的体系结构。这就是为什么它应该精心策划和精心执行。以下清单总结了有关服务器迁移的*重要问题。
• 新服务器应该具有哪种架构?
• 项目的架构是否适合您的需求?
• 是否有必要的财务资源和专家可用于迁移和后续服务器配置?
• 所选硬件是否足够灵活,可用于项目的未来发展?
• 迁移过程应该在运行期间进行还是应该在整个过程中中断所有活动?
• 维持运营是否与相关资源成比例且复杂性增加?
• 否则可以采取哪些措施来尽可能降低停机时间?
• 如何确保数据库条目的完整性并确保它们是*新的?
• 如何测试新服务器的功能?
• 数据迁移完成后某些应用程序无法运行时会发生什么?

利用Python下载文件

利用Python下载文件

利用Python下载文件也是十分方便的:

小文件下载
下载小文件的话考虑的因素比较少,给了链接直接下载就好了:

import requests
image_url = “https://www.python.org/static/community_logos/python-logo-master-v3-TM.png”

r = requests.get(image_url) # create HTTP response object

with open(“python_logo.png”,’wb’) as f:
f.write(r.content)

大文件下载
如果是小文件的话,一次性下载就OK了,但是如果文件比较大的话,那么下载下来的文件先放在内存中,内存还是比较有压力的。所以为了防止内存不够用的现象出现,我们要想办法把下载的文件分块写到磁盘中:

import requests

file_url = “http://codex.cs.yale.edu/avi/db-book/db4/slide-dir/ch1-2.pdf”

r = requests.get(file_url, stream=True)

with open(“python.pdf”, “wb”) as pdf:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
pdf.write(chunk)

批量文件下载:
批量文件下载的思路也很简单,首先读取网页的内容,再从网页中抽取链接信息,比如通过a标签,然后再从抽取出的链接中过滤出我们想要的链接,比如在本例中,我们只想下载MP4文件,那么我们可以通过文件名过滤所有链接:

import requests
from bs4 import BeautifulSoup

archive_url = “http://www-personal.umich.edu/~csev/books/py4inf/media/”

def get_video_links():
r = requests.get(archive_url)
soup = BeautifulSoup(r.content, ‘html5lib’)
links = soup.findAll(‘a’)
video_links = [archive_url + link[‘href’] for link in links if link[‘href’].endswith(‘mp4’)]

return video_links

def download_video_series(video_links):
for link in video_links:
file_name = link.split(‘/’)[-1]

print(“Downloading file:%s” % file_name)
r = requests.get(link, stream=True)

# download started
with open(file_name, ‘wb’) as f:
for chunk in r.iter_content(chunk_size=1024 * 1024):
if chunk:
f.write(chunk)

print(“%s downloaded!\n” % file_name)

print(“All videos downloaded!”)

return

if __name__ == “__main__”:
video_links = get_video_links()
download_video_series(video_links)

换个android 机, nfc 解放门卡

苹果机不小心丢了,换了个 redmi,试了下 nfc 门卡功能,小区门卡解锁可以使用了,可能我 out 了 才知道这个功能这么好用:

48 条回复  •  2021-03-22 09:32:21 +08:00

1 alanying   10 天前 小区要门禁,用 iPhone 和 Apple Watch 的 NFC 都不能代替门禁。 当时我就觉得自己好蠢,为什么要买个 Apple Watch 不买个 Android Wear

2 yinzhili   10 天前   9 你们打字这么频繁切换中英文不累吗

3 243205964   10 天前 via Android 三星没办法模拟我这小区门卡,回头我也换个 redmi 试试,要是能的话就太爽啦

4 knightdf   10 天前 我 iPhone 贴的卡贴解决的

5 lithiumii   10 天前 确实好用。不过好像有些加密门卡还需要用别的设备破解

6 lollxxox   10 天前   2 左手 apple watch,右手小米手环…..

7 11ssss   10 天前 网上查到 apple 可以把加入 apple pay 的各种卡让物业录到系统里,一直想去实践一下 还没好意思去找物业说

8 justrand   10 天前 可惜,这边已经是人脸识别了

9 goodhellonice   10 天前 也想买个安卓。。。无奈都太重了

10 noir   10 天前 @11ssss 这个方法从技术上来说是可以的 但是从小区管理角度就难说了 主要看小区安保这块对这个事情的态度 之前我在我们小区物业把公交卡识别号录入到门禁系统 可以直接刷门禁 结果第二天就被保安队长给取消了说不能这么搞…

11 proxychains   10 天前 @justrand 只能人脸吗?这种做业主没有反抗?

12 boyhailong   10 天前 @yinzhili 电脑上输入法智能提示的 @243205964 redmi 低端机不支持,中高端支持 @knightdf 这个也可以 @lithiumii 加密的忽略就行,现在遇到的两个小区都没问题 @justrand 人脸识别也有

13 brust   10 天前 ID 卡应该不行吧 买了个小米手环 结果公司卡和小区卡都是 ID 卡

14 11ssss   10 天前 @noir 是的 这种事看他们心情和脸色 所以一直没去

15 wolong   10 天前 @yinzhili 不需要切换,直接输入英文按回车,英文单词就上去了。

16 matepi   10 天前 小区 id 卡,直接 0.4mm 卡贴放 iphone 背后手机壳里了 实测也不影响无线充电

17 hs0000t   10 天前 via Android   1 @yinzhili 2021 年了,输入法已经可以中英文混输了,还带自动纠错的

18 chiu   10 天前 @yinzhili #2 不用切换,输入法知道你想打的是一个英文单词 Android

19 Chenamy2017   10 天前 @11ssss 我查到也是要找物业,准备交物业费时让他们试试,要是不给我试,就不交物业费!

20 imnpc   10 天前 1.iPhone 的是买 NFC 卡贴 复制门卡信息进去 请注意:部分地区电梯卡是滚动码,复制到卡贴以后刷 2 次原卡就失效了 只能使用卡贴刷电梯 门禁不限制 2.*大多数物业的系统是不支持输入第三方卡号的

21 hahiru   10 天前 我是手机复制的电梯卡,手表复制的公司卡。这样不用切换,刷哪个就是哪个。另外,华为部分表的 SAK 为 20,小米 color 的 SAK 为 08 。加密卡对 20 不太兼容。建议京东买后测试,无效方便退货。

22 lvybupt   10 天前 借楼求问,小区门禁和电梯是同一张 ic 卡,没加密。 自己复制的卡只能刷门禁,不能刷电梯,有大神知道原因给解答一下吗? uid 卡和 cuid 卡都试过了,手机 nfc,也都试过了,确认也不是滚动码。

23 BernieDu   10 天前 没啥用。低端小区和写字楼才门禁不加密,不过低端小区和写字楼默认都用 android

24 w99wjacky   10 天前   2 也不知道苹果什么狗屁逻辑 *不开放 SDK 第二自己也不开发相关功能 明明有 NFC,各种场景都用不了 只能等苹果自己开发功能。 大写的一个淦

25 Semidio   10 天前 小区用的 app,抓包重放就能解锁

26 wy315700   10 天前 NFC 确实好用,*近刚把小区门禁卡破解了。 小区门禁是 IC 卡,楼道是 ID 卡,正好有那种 IC ID 二合一的卡,一张卡顶两张用。

27 alfchin   10 天前 via Android @alanying 买了 Android wear 会觉得自己更蠢,还是不能在 ios 下使用,还不如来个华为

28 olbb   10 天前 小米好像不能模拟加密卡吧?

29 olbb   10 天前 @lithiumii 请问加密卡要怎么破解 能给点关键字吗

30 olbb   10 天前 @lvybupt 我家也是这样 不过我们这是加密卡

31 marktask   10 天前 @noir #10 你们小区保安权利还比较大,我们小区保安听物业的

32 SenLief   10 天前 这点华为还是做的不错的,对接了不少大的小区。

33 yyyb   10 天前 @yinzhili Shift

34 pH8   10 天前 via iPhone 小米手环解您忧

35 caotian   10 天前 手机背后贴个门禁卡贴不就行了, 我都贴了两个, 放手机壳里外面也看不出来,淘宝就有卖的,几块钱一张. @olbb pn532 acr-122u pm3 小米模拟加密卡得走个弯路, 原卡解密后清除密钥, 就是未加密卡了, 小米可以复制, 完了再用工具把密钥写到小米复制出来的卡上.

36 gwybiaim   10 天前 via iPhone 果子用户留下了羡慕的泪水

37 vincent9   10 天前 via Android @caotian 小米绕一下路复制 ID 卡,有没有经验证过的教程

38 naoh1000   10 天前 via iPhone 小区门禁问物业要了个密码 0011 输密码比刷卡快

39 loop00   10 天前 @lvybupt 如果确定不是滚动码,可能是 0 区块的问题,我记得是叫防火墙技术,就是检测 0 区块,有一种卡,好像是 fuid 可以解决; 0 区块写了一次后就固定了,无法修改了。具体你查下资料吧,我很久之前看过,细节记不清了。

40 bsulike   10 天前 小区人脸识别,不过公司门禁卡录不到 nfc 就很烦

41 caotian   10 天前 @vincent9 小米的是 m1 卡, 复制不了 ID 卡

42 pytth   10 天前 现在逐渐使用人脸识别了

43 guansixu   10 天前 @olbb 要是 M1 卡可以用 PN532,淘宝搜就可以,性价比*高的硬件

44 xingshu1990   9 天前 一个门禁卡 就黑苹果, 那人脸识别,要黑谁? 不觉得手机加一个门禁卡功能,会有什么质的提升。

45 lvybupt   9 天前 @loop00 好的,多谢

46 applehater   9 天前 @xingshu1990 我不想带卡,太麻烦。

47 xingshu1990   8 天前 @applehater #46 理解是可以理解,毕竟我裤兜里一串的钥匙,我也想把这一串钥匙给换成卡片,毕竟卡片比钥匙好多了。

 

安卓逆向有多神奇?什么都能破解?

47 条回复  •  2021-03-29 16:06:56 +08:00

1 abcbuzhiming   7 天前   1 逆向是一个*其看天赋的行业,不光安卓,理论上投入足够的人力物力,在能接触到程序本体的前提下,能够反向退出任何程序的全貌

2 janxin   7 天前 不神奇,就是把有限制的功能的限制解除掉

3 Kasumi20   7 天前 还不是因为安全做得太烂了,不做防护就是裸奔

4 fenghuanglucaks   7 天前 淘神费力的,没啥搞得。

5 murmur   7 天前 主要还是安卓不需要越狱天生盗版就简单,苹果想用盗版要么越狱要么 xx 助手

6 junyee   7 天前 我算是业余程序员,高中文化. 也玩过一阵子的安卓逆向,玩的时候甚至都不会写简单的 APK 程序. 在看了大量的 smali 代码后,也能稍微理解 APK 的运行环境了. 其间也改了好多 APK,并没有你想象的那么难,只是堆时间罢了. 我只对简单 APK 下手,有联网验证的不碰,有壳的(恶心)不碰.

7 junyee   7 天前 @fenghuanglucaks 确实. 费力不讨好. 改后纯自用,纯学习,不发布.,也不指靠这个挣钱. 当初是入坑是因为, 一款用了很久的的 launcher 不能在 5.0+设备上完美运行. 没有基础+个人愚笨 在这款 APP 上花费了上百小时… —

8 3dwelcome   7 天前 @junyee 一百小时*对可以自己写一个 launcher 了。

9 XD2333   7 天前 本质上还是通过修改 smali 的方式修改源代码.没啥神奇的.

10 nicevar   7 天前   2 没什么神奇的,经过 windows 安全发展就知道现在安卓逆向还处在少儿科阶段,什么时候安卓也开始有那个 10 个 G 的脱壳 helloworld 笑话,那真的是发展到顶峰了,现在还离得很远

11 ColoThor   7 天前 java 容易反编译

12 limuyan44   7 天前 大部分人也就 if 改成 goto,0x0 改成 0x1,不过说实话,大部分的 app 这么改也就够了,连个免费壳都没有。

13 jdjingdian   7 天前 @nicevar 能给个出处吗,看起来这个笑话很好笑的样子

14 nicevar   7 天前 @jdjingdian 看雪上的,调侃 windows 安全由加壳发展到虚拟机套虚拟机,大致就是一个风高夜黑的晚上,尼奥拿到了一个 10G 的 exe 文件,一番风雨终于脱壳成功,按捺不住内心的喜悦执行起来,终于。。。屏幕上缓缓出现一个窗口,上面出现了熟悉的字眼,hello world!

15 ParfoisMeng   7 天前 不只是 Android,一些小厂 Win 游戏没做加密也是随便破(官方不支持的 Mod 就是这种)。 初级就是杀时间,没太多技巧。扎进去慢慢找对应逻辑代码就行。

16 jdjingdian   7 天前 via iPhone @nicevar nb,hhhhh

17 loading   7 天前 via Android 费头发,可能还会进去蹲。

18 ChangQin   6 天前 via iPhone   2 @fenghuanglucaks 我有个哥们靠着个赚了快几百万了?

19 nmap   6 天前 @ChangQin 这种还能赚钱?愿闻其详

20 luwies   6 天前 我觉得很费精力,前两周完成了一部分破解,就不想继续了

21 wy315700   6 天前 逆向是个*其耗费精力,并且需要长时间工作的行业。 入坑之前先想想自己的头发

22 younghust   6 天前 其实还好,13-15 年那会儿,没什么加壳的,逆向起来贼舒服。后来就加壳产业化了。 安全意识提高了。

23 younghust   6 天前 可能有人还记得 14 年那个七夕 app, 被媒体神化成超级病毒,其实就是一个学了 1-2 个月的学生能搞出来的。

24 ChangQin   6 天前 via iPhone @nmap 只说一句,wx auto reply

25 zagfai   6 天前 @3dwelcome ???? 100 小时 launcher ??? 你天赋真好

26 zagfai   6 天前 @nicevar 和 PC 时代有点不同的是,现在是互联网化,凡是值钱的,都放在服务器上了。

27 3dwelcome   6 天前 @zagfai 那你说要多少小时?直接 github 搜搜案例代码,200 小时够吗? 同样花 100 小时在逆向,不一定能学到多少知识。 你花 100 小时专研源代码,收获*对更多。

28 Jat001   6 天前 逆向搞得好不一定挣大钱,但有可能因为刑法第 285 条和 286 条进去

29 janus77   6 天前 因为集齐了现在逆向的两大弱点 *是 java 这个语言,逆向难度不用我说了吧,资料太成熟了 第二是客户端模式,客户端有很多东西需要保存在本地,也有很多东西需要本地执行,另外加上安卓系统是开源的,底层也有办法破解,这也是很容易被破解的一点

30 ch2   6 天前 就是玩个解谜游戏,仅此而已

31 zagfai   6 天前 @3dwelcome 开发和逆向有相通,但也是两回事,各有各学的好处。 做个 launcher 单单是规划,做图设计,都要 100 个小时吧?。。。

32 yitingbai   6 天前   3 我做安卓逆向主要有 3 个时期 1. 早期安卓市场乱象丛生, 那时候随便找 app/游戏反编译, 然后插入广告代码, 再重新签名打包投入市场, 简简单单就能赚的盆满钵, 完全就是走量

33 yitingbai   6 天前   2 2. 中期安卓发展迅速, 各大市场也逐步规范, 垃圾 APP 很难上架了, 但是各大 APP 野蛮推广需要大量的流量, 也就催生了改机工具, 利用 root+xposed 动态修改 app 设备唯一性验证, 伪造新机器注册 app 搞钱, 本人就是 xx 改机助手的作者, 曾经做到不少用户,应察觉到市场越来越规范, 在净网行动之前, 很早就停止更新了,后来听说什么 NZT 之类改机软件团队被抓了,心有余悸~

34 yitingbai   6 天前 3. 目前安卓市场基本稳定, 市场被几大头部公司垄断, 但是又催生了新的应用场景,例如各大电商刷流水,但是因为风控技术的提升, 普通 root+xposed 或者免 root va 之类的沙盒都难以突破检查.*终采用编译安卓系统源码, 自制 rom, 从系统界别注入代码, 修改软件行为. 但是为控制风险, 不再做公开逆向工具

35 wangxiyu191   6 天前 理论上是都能逆的。想完全不被逆只能求助硬件了(类似 TEE 啥的),但硬件也不是*对安全的,只是想搞事难更高。 *终是人与人脑力和体力的斗争(各种工具其实也包含其中了)。有时候想想感觉挺浪费人力的,这种斗争中处于顶尖水平的两方都是有*高天赋 /能力的,然后这些就被拿去和对面“与人斗其乐无穷”了。 只能说存在即合理吧,双方的付出肯定都是有价值的。

36 GeruzoniAnsasu   6 天前 请完全参照 “爬虫有多神奇?” 下到一行代码上到与 bat 对抗 水深得很

37 maokabc   6 天前 via Android 大部分没什么难度,多年前初学编程就是从解析 dex,修改字节码入手。不过真正要写出实际可用的库还是很难,*后只能用 dexlib 魔改,然后源码扔 googlecode 不再碰这些。 现在那一堆工具,连.dex 、.arsc 这些文件结构都不用了解,就可以修改那些没加固的 app 。

38 1if5ty3   6 天前 想起来塞班时代,当时还是高中。那时候论坛都在魔改手机 QQ,增加一些额外的功能。 看着教程也都会了。不知道这个算逆向吗?

39 iscurry   6 天前 @Jat001 漂亮

40 keymao   5 天前 大致就是处理汇编代码或中间代码,改变软件得功能逻辑达到自己目的的一种手段。 现如今破解非常的耗神,之前逆向了一个文件加解密系统,麻烦的一批。别看他们搞教程得弄得很顺,那是准备好的 helloworld… 能上机器跑的程序大多逻辑都很复杂,对方代码再写的糟糕一点,逆向起来会非常的迷惑。。

41 jmk92   5 天前 这么看来,搞反逆向的,需要更牛逼了。天天变着法的想还有没有后门被逆向。

42 q9339   5 天前 @yitingbai 高手。。。 啊

43 ragnaroks   5 天前 CheatEngine 的教程,算是逆向里面的幼儿园,锁数值,写 nop 都是*低端手段,但是大多数游戏(软件)这样也就够了

python 项目目录结构

python 项目目录结构

一、常见的结构

关于如何组织一个较好的Python工程目录结构,已经有一些得到了共识的目录结构。在Stackoverflow的这个问题上,能看到大家对Python目录结构的讨论。

这里面说的已经很好了,我也不打算重新造轮子列举各种不同的方式,这里面我说一下我的理解和体会。

假设你的项目名为foo, 我比较建议的*方便快捷目录结构这样就足够了:

Foo/
|– bin/
| |– foo
|
|– foo/
| |– tests/
| | |– __init__.py
| | |– test_main.py
| |
| |– __init__.py
| |– main.py
|
|– docs/
| |– conf.py
| |– abc.rst
|
|– setup.py
|– requirements.txt
|– README
简要解释一下:

bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口*好命名为main.py。
docs/: 存放一些文档。
setup.py: 安装、部署、打包的脚本。
requirements.txt: 存放软件依赖的外部Python包列表。
README: 项目说明文件。
除此之外,有一些方案给出了更加多的内容。比如LICENSE.txt,ChangeLog.txt文件等,我没有列在这里,因为这些东西主要是项目开源的时候需要用到。

二、如何解决多次目录下数据的导入?

1.比如:main.py中导入docs文件中的conf.py中的函数

from docs improt conf         #这样的导入是不成功的

因为from导入的是该目录即foo文件下的文件夹,docs与foo文件夹是一级的目录导入不成功

2.解决方案

import os,sys

path = os.path.join(os.path.dirname(os.path.abspath(__file__)))
#返回脚本的*对路径
sys.path.append(path)
#临时添加搜索路径,这种方法导入的路径会在python程序退出后失效。

#path1=os.path.abspath(__file__)
#print(path1)#当前文件的*对路径

#path2=os.path.dirname(os.path.abspath(__file__))
#print(path2)#当前文件的上一层目录的*对路径

#path3=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#print(path3)#当前文件的上上层目录的*对路径

#os.path.join()函数用于路径拼接文件路径
 

使用 Docker 打包 Python 项目

使用 Docker 打包 Python 项目

1. 获取 Python 的镜像文件
项目的封装可以建立在已有镜像的基础上,在 Ubuntu 中可通过
docker pull python:3.6.8-slim-stretch # 这里选取了3.6版本
获取 Python 镜像

2. 配置 Dockerfile 文件
在 Python 项目的根目录新建 Dockerfile 文件,在 Dockerfile 文件中写入下面内容:

FROM python:3.6.8-slim-stretch

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install –no-cache-dir -r requirements.txt

COPY . .
ENTRYPOINT [“python”]
CMD [“./run.py”]

3. 创建镜像
创建镜像的命令为:
docker build -t python-project:1.0 .
需要注意的是*后面的 “.” 不能省略

4. 运行镜像
运行镜像的命令为:

docker run –rm -p 5000:5000 –name pyproject python-project:1.0
1
这行命令中的几个参数的含义分别如下

–rm:表示关闭命令行窗口时,运行该镜像的进程会同时关闭;
-p:用来设置端口映射,即把电脑主机的端口映射到 docker 容器中的端口,如何封装的是一个 web 服务,那么必须要设定端口映射;
–name:用来为运行的镜像设置别名,方便后面的调用
此外,可能会经常用到的参数还有:

-e:为镜像添加环境变量
-d:使 web 在后台持续运行
5. 常用命令总结
docker build -t pflask:1.0 . 创建镜像

docker images | grep python 查看镜像

docker run –rm -p 5000:5000 pflask:1.0 运行镜像

docker run –rm -p 5000:5000 -e env1=evn1 pflask:1.0 加入环境变量

docker run -d pflask:1.0 运行docker并守护进程

docker ps -a 查看当前正在运行的所有镜像

docker stop IMAGE_ID 根据 IMAGE_ID 停止镜像进程

docker rm -f IMAGE_ID 根据 IMAGE_ID 删除镜像进程

docker rmi IMAGE_ID 根据 IMAGE_ID 删除镜像

docker logs -f tname 根据助记符查看日志

ss -anp | grep 5000 从所有端口中过滤出 5000

curl -v “http://192.168.195.100:5000” 测试连接

cat hello.py 查看文件

a256sum hello.py 散列算法

Dockerfile内容
FROM python:3.6.8-slim-stretch
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install –no-cache-dir -r requirements.txt
COPY . .
ENTRYPOINT [“python”]
CMD [“/run.py”]

python项目打包部署

python项目打包部署

浏览了以上所有人的答案,结合我平常在项目中的实际经验,谈谈我们团队的Python部署与发布流程。
目前很多公司还是用着石器时代的部署方式,怎么做呢?

  1. 1. 本地写代码,可能还没有virtualenv环境,是的其实我的老东家就是这样的。
  2. 2. 写一个脚本,安装需要的依赖到系统global环境,比如说 MySQLdb,
  3. 可能还要用apt-get 或者 yum 安装 python-dev 等等系统依赖,然后用pip 安装Python依赖。
  4. 3. 提交到svn/git,然后在测试机器上拉代码下来,运行脚本安装完依赖后,
  5. 如果是一个web项目,那么可能会直接 python web.py 8080 测试一下会不会报错,
  6. 测试完几个接口发现没问题,关掉测试机器。
  7. 4. 在生产环境把代码拉下来,或者通过部署系统,这里的部署系统一般是一个web页面,
  8. 能够将svn/git 上的代码打包后执行某一个脚本,来完成相应的部署,
  9. 也有可能是直接在机器上执行:
  10. nohup python /path/to/python/main.py 2&1 > /dev/null &
  11. 就启动来这个进程,然后自己可能还有一些业务监控来定时的监控这个脚本的存活状态。
  12. 5. 这里可能nginx已经配置好,你发布的是一个Django应用,那么打开浏览器,
  13. 查看网页无误。

ok,大功告成,我已经是一位合格的工程师了,我所理解的Python发布或者所有的发布不都是这样么,大家都是这样的
如果你躺枪了,很好,我喜欢。
让我们看看这里的步骤缺少什么,我不仅仅从发布部署来说,我们谈谈一个理想的开发测试部署流程应该是怎样的。
1. 你应该有一个与线上环境一模一样的测试/开发机器,这里说的是系统环境而不是物理环境,比如说内核版本,Python版本,libc 版本,gcc 版本,shell 的环境等等都应该跟线上环境一样,这是保证代码质量的*关,或许不应该叫做代码质量而是工程质量。有人可能会用eclipse或者其他的云云开发IDE,OK,没问题,保证系统是一样的,这里有点难。
2. 你应该有一个virtualenv环境,因为你的开发机器可能有多个项目,而且可能因为有些依赖版本问题,导致你发现不同的项目可能对同一个模块有不同版本的依赖,那么请你准备一个virtualenv环境,这是Python开发人员必备的。
3. 你应该把代码提交到git, 但是提交之前,你应该运行一般单元测试,单元测试包含两个部分,一是对整个项目里的所有代码有一个代码静态检查,例如pylint和pep8,第二部分是自动运行你的测试用例,因为你的一个小改动可能会影响到其他模块,而这一点你开发的时候没有意识到或者说你影响的模块不是你写的,这一点会让你写的代码更健壮,同时你更有信心对现有代码做新需求开发或者变动,这里,你可以把你的测试用例启动脚本活着命令加到git hook,这样每次commit的时候都会启动测试程序。
4. OK,保证测试用例通过后,你应该对这次写的代码很有信心了,那接下来就是把代码发布到测试环境。怎么做呢?

一个起码看起来合格的Python项目,大体上代码构建的目录应该是下面这样的,请参考《以正确的方式开源Python项目》oschina.net/translate/o
所有的代码文件都在pro中,其他都是项目发布于部署使用到的

  1. -rwxr-xr-x 8 root root 4096 Sep 16 22:06 .git/
  2. -rw-r–r– 1 root root 434 Aug 10 16:00 .gitignore
  3. -rw-r–r– 1 root root 166 Jul 26 11:49 AUTHORS.md
  4. -rw-r–r– 1 root root 149 Aug 10 16:49 AUTHORS.rst
  5. -rw-r–r– 1 root root 0 Aug 10 16:49 CONTRIBUTING.rst
  6. -rw-r–r– 1 root root 245 Jul 26 11:59 HISTORY.md
  7. -rw-r–r– 1 root root 100 Aug 10 16:49 HISTORY.rst
  8. -rw-r–r– 1 root root 1453 Aug 10 16:49 LICENSE
  9. -rw-r–r– 1 root root 221 Aug 10 16:49 MANIFEST.in
  10. -rw-r–r– 1 root root 2964 Sep 12 11:19 Makefile
  11. -rw-r–r– 1 root root 239 Jul 26 11:49 README.md
  12. -rw-r–r– 1 root root 161 Aug 10 16:49 README.rst
  13. drwxr-xr-x 2 root root 4096 Sep 16 22:06 conf/
  14. drwxr-xr-x 2 root root 4096 Jul 26 11:59 deb-scripts/
  15. drwxr-xr-x 2 root root 4096 Aug 23 15:52 doc/
  16. drwxr-xr-x 8 root root 4096 Jan 16 13:12 pro/
  17. -rw-r–r– 1 root root 67 Aug 10 16:49 requirements-dev.txt
  18. -rw-r–r– 1 root root 284 Sep 2 15:34 requirements.txt
  19. -rw-r–r– 1 root root 22 Aug 10 16:49 setup.cfg
  20. -rwxr-xr-x 1 root root 1406 Aug 10 16:49 setup.py*
  21. drwxr-xr-x 4 root root 4096 Sep 2 17:30 utils/

我来解释一下这里的几个主要文件的作用. 这里的目录结构可能也跟我们团队的命名习惯有关.

  1. conf/
  2. conf/api.conf // 项目配置
  3. conf/logrotate.conf // 日志轮转配置
  4. conf/uwsgi.ini // uwsgi 配置
  5. conf/pro.upstart // upstart 文件
  6. conf/paste.ini // paste 是用来部署uwsgi的一个中间件
  7. conf/pro.cron // 这里是crontab配置
  8. conf/pro // 其他配置,可能是允许执行的sudo命令等

deb-scripts/ 包含三个文件,这里我们说debian系统打包,Redhat 打 rpm 也同理。

  1. eb-scripts/before-remove.sh // 卸载前执行的脚本
  2. deb-scripts/before-install.sh // 安装前执行的脚本
  3. deb-scripts/after-install.sh // 安装后执行的脚本

doc/ 应该是项目的文档,这里推荐用sphinx 生成文档或者你自己写markdown也可以。

utils/ 下面包含了你可能需要用到的启动依赖,但是又不想每次都远程下载,且不是Python本身的依赖而是环境依赖,好吧,我们在utils下面放了一个virtualenv,执行virtualenv 就可以在本地生成一个virtualenv 环境了, 还有打包deb的脚本

Makefile 文件包含了很多命令,比如:

  1. make test // 执行单元测试和静态检查
  2. make lint // 执行 pylint
  3. make pep // 执行pep8 检查

一系列你经常用到的功能,都可以放到Makefile

2. 你应该把你的代码打成一个安装包,而不是一个压缩包,因为你要发布的是一个服务而不是一个模块,那么请你打成deb或者rpm包。
让我们看下打包代码:

  1. #!/bin/sh
  2. set -e
  3. … // 省略了变量部分
  4. if [ ! -d wheelhouse ]; then
  5. make wheel
  6. fi
  7. fpm -t deb -s dir -n “$PKG_NAME” -v “$VERSION” –prefix “$DEST_DIR” -f \
  8. –depends make \
  9. -x ‘*__pycache__’ \
  10. -x ‘*.pyc’ \
  11. -x ‘*.pyo’ \
  12. -x ‘*.deb’ \
  13. –before-install deb-scripts/before-install.sh \
  14. –after-install deb-scripts/after-install.sh \
  15. –before-remove deb-scripts/before-remove.sh \
  16. Makefile HISTORY.rst LICENSE AUTHORS.rst CONTRIBUTING.rst setup.cfg \
  17. MANIFEST.in README.rst setup.py utils requirements-dev.txt requirements.txt wheelhouse conf \
  18. $PYTHON_MODULES

一目了然,我们会把依赖打到 wheelhouse 里面,然后把 wheelhouse 一同打包到 deb 包,这里使用了 fpm 这个打包工具,需要安装ruby gem 来安装。
然后在你的 make install 命令可以包含下面这个:

pip install --use-wheel --no-index --find-links=wheelhouse -r requirement.txt

在你的 deb-scirpt/after-install.sh 里面,这个脚本会在deb包安装完成后执行,你应该在这里完成你的环境依赖安装还有你配置文件的加载,crontab的配置等,一个简单的脚本应该像下面这样:

  1. #!/bin/sh
  2. set -e
  3. PREFIX=${PREFIX:-/opt/pro}
  4. REPODIR=${REPODIR:-/data2/pro}
  5. LOGDIR=${LOGDIR:-/data2/log/pro}
  6. IMAGE_CACHE=${IMAGE_CACHE:-/data2/image/cache}
  7. RUN_AS_USER=www-data
  8. mkdir -p $REPODIR
  9. mkdir -p $LOGDIR
  10. mkdir -p $IMAGE_CACHE
  11. chown -R “$RUN_AS_USER”:”$RUN_AS_USER” $REPODIR
  12. chown -R “$RUN_AS_USER”:”$RUN_AS_USER” $LOGDIR
  13. chown -R “$RUN_AS_USER”:”$RUN_AS_USER” $IMAGE_CACHE
  14. cd “$PREFIX”
  15. # this project does not require install.
  16. # make bootstrap install
  17. make bootstrap
  18. # install crontab, upstart job, logrotate config etc
  19. install conf/pro.upstart /etc/init/pro.conf
  20. install conf/logrotate.conf /etc/logrotate.d/pro
  21. install -o root -m 0440 conf/pro /etc/sudoers.d/pro
  22. install -o root -m 0644 conf/pro.cron /etc/cron.d/pro
  23. start pro || true

3. *后一步就是 start pro
这里使用upstart启动你的应用,你应该把你的应用交给系统而不是你自己
所以在 after-install 中,你需要把pro.conf这个文件安装到 upstart 目录.
4. 以上的所有步骤,还在你的本地,你需要做的是把代码发布到生产环境。这里你需要把你的deb包上传到私有apt源,然后就是发布到正式环境了。
5. 发布有几种方式:

  1. 1. 在机器上直接执行 apt-get install pro(不推荐)
  2. 2. 利用fabric执行远程命令发布(次不推荐)
  3. 3. 利用puppet发布(推荐)

前两者无需多说,利用puppet发布,可以使你的发布更佳规范,同时也可以对配置做更规范的管理,一些系统依赖,不是Python的而是系统本身的,比如有时候出现libpcre 这样的二进制系统依赖的时候,你应该利用puppet安装这些依赖,而不是手动去执行安装, 具体的 puppet 相关就不细说了。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速