我有一个utils包,它为我的(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
还有其他方法吗?我不想在每个客户端目录中使用utils /,因为它实际上是所有脚本都需要的通用包,如果我对其进行更改,它应该反映在使用它的所有脚本中。
将客户端脚本转换为包也是不对的,因为它们实际上并非如此。另外,如何工作,我尝试将空__init__.py
放在/ scripts /和/ scripts / client * / dirs中,但这无论如何都没有用。
我可以为每个客户端做符号链接到../utils/,但是,这是需要跟踪的其他信息,客户列表正在改变,听起来不对(但是我希望无论如何我最终还是会这样做。)
我看了As a Java programmer learning Python, what should I look out for?,但这里并没有真正描述过。在python source code organization and __init.py__ - 我似乎有类似的设置,但我无法从兄弟目录导入utils或..utils?
答案 0 :(得分:0)
Q& D解决方案是添加路径"脚本"导入sys.path
前的utils
目录:
# 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或类似的东西进行部署......一开始会涉及更多,但从长远来看更容易维护。