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

时间:2018-02-16 14:05:39

标签: python directory-structure

我有一个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?

1 个答案:

答案 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或类似的东西进行部署......一开始会涉及更多,但从长远来看更容易维护。