【问题标题】:What is the preferred way to reuse Python code across multiple projects [duplicate]在多个项目中重用 Python 代码的首选方法是什么 [重复]
【发布时间】:2014-06-17 13:53:15
【问题描述】:

我已经在我的项目中使用了很多小函数和代码 sn-ps。

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

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 sn-ps 的方法吗? (除了复制粘贴)

【问题讨论】:

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


    【解决方案1】:

    我已经使用版本控制处理了这个问题;就我而言,Mercurial。

    假设我有这个目录结构:

    项目\蟒蛇\ 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 超时.py 用户代理.py 刮刀库\ .hg __init__.py something_else.py py_prog\ 库\

    我正在编写一个名为py_prog 的程序。我希望使用库 general_libsscraper_libs 中的代码,但我希望该方法保持“副本”和原始位置之间的“链接”。

    在这种情况下,general_libsscraper_libs 都是 mercurial 存储库。

    Mercurial(和 git)提供 clone 命令。此命令将源存储库克隆到(如果没有另外指定)当前目录。使用克隆的存储库,您可以在原始存储库中推送和拉取更新,而无需重新复制或覆盖。

    在控制台中导航到 Projects\python\py_prog\libs 我运行 mercurial 命令:

    项目\python\py_prog\libs> hg 克隆 ..\..\general_libs 项目\python\py_prog\libs> hg clone ..\..\scraper_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 超时.py 用户代理.py 刮刀库\ .hg __init__.py something_else.py py_prog\ py_prog.py 库\ 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 超时.py 用户代理.py 刮刀库\ .hg __init__.py something_else.py

    现在我可以在不更改系统路径的情况下导入这些库函数。

    py_prog.py:

    from libs.scraper_libs.something_else import something
    

    或者,您可以使用符号链接(在 *nix 中)或连接点(在 Windows 中)实现类似的结果(尽管没有修订控制的其他好处)。

    【讨论】:

    • 您是编写克隆脚本还是仅在项目开始时/库更改时编写脚本?
    • 您通常手动管理更改行为。我相信您可以从将更新其克隆的原始库中hg push;所以这是一个单一的操作。
    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2012-10-08
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多