在多个项目中重用Python代码的最佳方法是什么
我有很多小函数和代码片段,这些都是我在项目中用到的。
比如,给一些库加上简单的包装,以便完成常见的任务:
def DownloadFile(url, filename):
output = open(filename,'wb')
output.write(urllib.request.urlopen(url).read())
output.close()
或者,有一种快速的方法来捕捉和忽略错误:
def deleteFile(f):
if f == "":
pass
else:
try:
os.remove(f)
except:
print("Cant delete ",f)
我有很多这样的函数,我是通过
sys.path.append('../../blah')
import lib_file as fle
来调用它们的。
我想知道,处理这些函数的最佳方法是什么:
a) 把它们放到一个合适的库里,然后导入使用
b) 熟练掌握标准的Python库,这样就不需要包装了
c) 还有其他方法可以重用Python代码片段吗?(除了复制粘贴)
1 个回答
1
我遇到过这个问题,使用的是版本控制工具;在我的情况下,是Mercurial。
假设我有这样的文件夹结构:
Projects\python\ general_libs\ .hg __init__.py acldict.py easy_csv.py easy_tar.py fake_file.py list_extract.py state_machine.py tag_extract.py timeout.py user_agents.py scraper_libs\ .hg __init__.py something_else.py py_prog\ libs\
我正在写一个叫做 py_prog
的程序。我想使用 general_libs
和 scraper_libs
这两个库里的代码,但我希望能够保持“链接”,也就是说,复制的代码和原始位置之间要有联系。
在这个例子中,general_libs
和 scraper_libs
都是Mercurial的代码库。
Mercurial(还有git)提供了一个 clone
命令。这个命令可以把源代码库复制到当前目录(如果没有特别指定的话)。通过克隆的代码库,你可以把更新推送到原始代码库,也可以从原始代码库拉取更新,而不需要重新复制或覆盖。
在控制台中导航到 Projects\python\py_prog\libs
,我运行了Mercurial的命令:
Projects\python\py_prog\libs> hg clone ..\..\general_libs Projects\python\py_prog\libs> hg clone ..\..\scraper_libs
现在文件夹结构看起来是这样的:
Projects\python\ general_libs\ .hg __init__.py acldict.py easy_csv.py easy_tar.py fake_file.py list_extract.py state_machine.py tag_extract.py timeout.py user_agents.py scraper_libs\ .hg __init__.py something_else.py py_prog\ py_prog.py libs\ general_libs\ .hg __init__.py acldict.py easy_csv.py easy_tar.py fake_file.py list_extract.py state_machine.py tag_extract.py timeout.py user_agents.py scraper_libs\ .hg __init__.py something_else.py
现在我可以导入这些库的功能,而不需要改变系统路径。
py_prog.py:
from libs.scraper_libs.something_else import something
另外,你也可以通过使用符号链接(在 *nix 系统中)或连接点(在Windows中)来实现类似的效果,虽然这样做没有版本控制的其他好处。