我有一组这样组织的 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该工具尤其使虚拟环境的使用变得简单。
