使用不同脚本(代码组织)重用模块



我有一个实用程序包,它为我的(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 或类似的东西部署它......一开始参与度更高,但从长远来看更容易维护。

最新更新