Skip to main content
 首页 » 编程设计

Python 包内导入之如何让通用函数/类分布在我的包中

2025年05月04日13qq78292959

我有一组这样组织的 python 脚本:

PythonScripts/ 
     TypeAScripts/ 
        TypeASet1Scripts/ 
            example.py 
        TypeASet2Scripts/ 
     TypeBScripts/ 
        TypeBSet1Scripts/ 
        TypeBSet2Scripts/ 
     TypeCScripts/ 
        TypeCSet1Scripts/ 
        TypeCSet2Scripts/ 
     CommonFunctions/ 
        CommonFunctions.py 

每个文件夹中都有 init.py。我想要的是能够运行 example.py,其中 example.py 从 CommonFunctions 导入。我希望整个文件夹 A、B 和 C 中的脚本都执行相同的操作。

要用绝对导入来做到这一点,你会把

 import PythonScripts.CommonFunctions.CommonFunctions  

但是,这仅在 PythonScripts 在您的 python 路径中时有效。其中,如果您只是在该文件夹中运行 example.py,则情况并非如此。您可以使用 sys.append() 添加它,但这似乎是一种笨拙的做法。有没有更好的方法?

请您参考如下方法:

Python 支持相对导入,但根据我的经验,它们很挑剔,不会做您期望它们做的事情。您可以在 PEP 328 中找到有关它们的更多信息.

我会建议正确打包您的模块并编写一个 setup.py 文件以将它们安装到全局站点包目录中。这将允许您使用绝对导入从系统上的任何位置引用您的模块,并且还为您提供了使用 Python Package Index (PyPi) 注册它们的选项。用于分发给第三方。关于如何执行此操作的一个很好的教程是 "The Hitchhiker's Guide to Packaging 1.0" .

此外,如果您担心让您的全局站点包目录变得乏味,我建议您在 Python virtual environment 中进行测试安装。 . virtualenv该工具尤其使虚拟环境的使用变得简单。