我在一个相当标准化的目录结构中为不同的项目做了很多工作(我是一名科学家)。例如:
project
/analyses/
/lib
/doc
/results
/bin
我将所有各种实用程序脚本放在/bin/中,因为清洁仅次于虔诚。但是,我必须对路径进行硬编码(例如 ../../x/y/z),然后我必须在 ./bin/中运行,否则它们会中断。
我用过 Django,它有/manage.py,它运行各种 django-things 并自动处理路径。我还使用 fabric 来运行各种用户定义的函数。
问题:我该如何做类似的事情?最好的方法是什么?我可以轻松地在/manage.py 中写一些东西来将根目录注入(inject) sys.path 等,但是我希望能够执行将运行/bin/foo.py 的“./manage.py foo”。或者是否有可能让 fabric 从某个目录调用可执行文件?
基本上 - 我想要一些简单且维护成本低的东西。我希望能够将可执行脚本/文件/任何内容放入 ./bin/而不必处理路径问题或导入问题。
执行此操作的最佳方法是什么?
最佳答案
继续在 TLD 执行
一般来说,尽量让你的运行时保持在顶层。这将极大地理顺您的导入。
如果您必须对相对导入进行大量导入寻址,则可能有 更好的方法。
修改路径
其他张贴者提到了 PYTHONPATH
。这是在您的 shell 中永久执行此操作的好方法。
如果您不想/不能直接操作 PYTHONPATH
项目路径,您可以使用 sys.path
让自己摆脱相对导入的 hell .
使用sys.path.append
sys.path
在内部只是一个列表。您可以附加到它以将内容添加到您的路径中。
假设我在 /bin
中,并且在 lib/
中有一个库 markdown
。您可以使用 sys.path
附加相对路径以导入您想要的内容。
import sys
sys.path.append('../lib')
import markdown
print markdown.markdown("""
Hello world!
------------
""")
明智的话:不要对 sys.path 添加过于疯狂。保持您的架构简单,以避免您自己产生很多困惑。
过于急切的导入有时会导致 python 模块需要导入自身的情况,此时执行将停止!
使用包和__init__.py
另一个很棒的技巧是通过添加 __init__.py
文件来创建 python 包。 __init__.py
在目录中的任何其他模块之前被加载,因此这是在整个目录中添加导入的好方法。这使其成为添加 sys.path
黑客的理想场所。
您甚至不需要向文件中添加任何内容。只需在控制台执行 touch __init__.py
即可将目录设为包。
See this SO post一个更具体的例子。
关于python - 在 Python 中处理项目脚本中的路径/可执行文件的最佳实践(例如 Django 的 manage.py 或 fabric),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9184629/