我有一组这样组织的 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
该工具尤其使虚拟环境的使用变得简单。
关于Python 包内导入 - 如何让通用函数/类分布在我的包中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14867952/