python - 在 Python 中处理项目脚本中的路径/可执行文件的最佳实践(例如 Django 的 manage.py 或 fabric)

标签 python fabric

我在一个相当标准化的目录结构中为不同的项目做了很多工作(我是一名科学家)。例如:

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/

相关文章:

python - 计算所有部门列的累计和

python - 将 Python 列表写入单个 CSV 列

python - 无法使用 Fabric 和 nohup 真正后台 SSH 隧道

python - 为什么要在 Fabric 脚本中逐行重新执行 shell 命令?

path - 如何在 Fabric 中将 PATH 变量添加到 sudo

python - 使用命名空间构建结构项目

python - 最后在 django 中看到一个用户

python - PyYaml 向后倾倒东西

python - 带条件问题的 Django 表单向导

python - 为什么我的 Python 脚本编写的是 Windows 风格的回车符?