什么是在多个项目中重用Python代码的首选方式?

4
我结束了许多在我的项目中使用的小函数和代码片段。例如,对库的包装以执行常见任务:
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_libsscraper_libs库中的代码,但我希望该方法保持“链接”在'复制品'和原始位置之间。
在这种情况下,general_libsscraper_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中)来实现类似的结果(尽管没有修订控制的其他好处)。


你是在项目开始或者库发生变化时编写克隆脚本吗? - acutesoftware
通常情况下,您需要手动管理更改行为。我相信您可以从原始库中进行hg push操作,以更新其克隆;因此这是一个单一的操作。 - dilbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接