我有很多这样的脚本组织如下:
root
group1
script1.py
script2.py
group2
script1.py
script2.py
group3
script1.py
script2.py
utils
utils1.py
utils2.py
所有脚本* .py都使用utils文件夹中的函数。目前,我将utils路径附加到脚本以导入utils。
然而,这似乎是不好的做法(或“不是Pythonic”)。此外,实际上这些组并不像这样平坦,并且有比上面列出的更多的util文件夹。因此,附加路径解决方案变得更加混乱和混乱。
我如何以不同的方式组织这个?
答案 0 :(得分:3)
首先使所有目录都可导入,即使用__init__.py
。
然后有一个顶级脚本接受参数并根据它调用脚本。
从长远来看,基思提到的有关distutils的内容是正确的。否则,这是一个更简单(肯定不是最好的)解决方案。
组织
runscript.py
group1
__init__.py
script1.py
utils
__init__.py
utils1.py
<强>调用强>
python runscript -g grp1 -s script1
<强> runscript.py 强>
import utils
def main():
script_to_exec = process_args()
import script_to_exec as script # __import__
script.main()
main()
也许你的脚本可以有main函数,然后由runscript调用。 我建议你在顶层有一个脚本来导入脚本。
答案 1 :(得分:1)
您可能也有兴趣: Python 3: Good location(s) to install own and 3rd party packages?
是的,我可以看到软件包是如何帮助的,但是如果您仍在使用utils并在处理group1,group2等时更改它们,那么进行安装会产生大量开销。
仍然在寻找好的答案。
答案 2 :(得分:1)
我们无法真正了解您的用例来自人为的例子。我建议创建一个包含utils模块和其他脚本的包,然后使用脚本中的相对导入,例如from ..utils import utils1
。当然,您不会将顶级软件包称为“root”,而是选择类似项目名称的名称。
如果你真的有很多这样的脚本,那么拥有一个运行脚本然后根据cmdline参数导入模块可能是有意义的。然后像runner.py <somecommand>
之类的东西会导入并执行<top package>.commands.somecommand.runFunction
(例如Django会这样做 - 使项目可扩展)。
答案 3 :(得分:0)
您需要使用包裹。当一个目录中有一个名为__init__.py
的文件时,Python会将该目录识别为一个包。最好还是使用distutils制作一个源包,它也会为你安装它。几乎不会修改sys.path,安装包会将它放在标准位置(site-packages),因此您不必修改它。