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

时间:2014-05-01 03:48:05

标签: python architecture module python-import code-reuse

我已经结束了很多我在项目中使用的小函数和代码片段。

例如,围绕库执行常见任务的包装器:

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 个答案:

答案 0 :(得分: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中)实现类似的结果(尽管没有修订控制的其他好处)。