我有一个实用程序包,它为我的(crontab)Python脚本提供函数。
脚本组织在同一路径上的不同目录中:
例如:
scripts/client1/process-client1.py
.. /client2/process-client2.py
.. /client3/process-client3.py
.. /utils/foo.py
所有这些文件都存在于SVN存储库中的类似设置中(除了每个文件在实际代码之前都有trunk/和tags/,所以我在需要时将它们导出到生产环境)
utils 包中的模块应该可用于所有脚本(utils 包确实包含__init__.py
)
我尝试了相对导入,process-client1.py:
import ..utils
但是,显然我得到了:ValueError: Attempted relative import in non-package
还有其他办法吗?我不想在每个客户端目录中使用/,因为它确实是所有脚本都需要的通用包,如果我对其进行更改,它应该反映在所有使用它的脚本中。
将客户端脚本转换为包听起来也不对,因为它们实际上不是。 另外,这将如何工作,我尝试在/scripts/和/scripts/client*/目录中放置空__init__.py
,但这并没有帮助。
我可以为每个客户端做符号链接到../utils/,但是,这是需要跟踪的其他信息,客户端列表正在更改并且听起来不正确(但我希望我最终可能会这样做)。
我看了 作为一个学习Python的Java程序员,我应该注意什么?,但这并没有真正描述在那里。在python源代码组织和__init.py__ - 我似乎有类似的设置,但我无法导入utils或..来自兄弟姐妹目录的效用?
Q&D 解决方案是在导入utils
之前将"scripts"目录的路径添加到sys.path
# process-client-XXX.py
import os, sys
root = os.path.dirname(os.path.dirname(os.path.abspath(__file)))
if root not in sys.path:
sys.path.insert(0, root)
from utils import foo
# your code here
这真的很丑陋,但只要您的目录布局不改变,它应该可以工作。
干净的解决方案是正确打包utils
以便您可以使用 pip 或类似的东西部署它......一开始参与度更高,但从长远来看更容易维护。