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

4 投票
1 回答
2426 浏览
提问于 2025-04-18 04:58

我有很多小函数和代码片段,这些都是我在项目中用到的。

比如,给一些库加上简单的包装,以便完成常见的任务:

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中)来实现类似的效果,虽然这样做没有版本控制的其他好处。

撰写回答