从不同的工作目录导入Python模块

Dav*_*idM 30 python

我有一个Python脚本,它使用内置模块,但也导入了许多与主脚本本身存在于同一目录中的自定义模块.

例如,我会打电话

python agent.py
Run Code Online (Sandbox Code Playgroud)

and agent.py有许多导入,包括:

import checks
Run Code Online (Sandbox Code Playgroud)

其中,检查位于与agent.py相同的目录中的文件中

agent/agent.py
agent/checks.py
Run Code Online (Sandbox Code Playgroud)

当前工作目录是代理/然后一切都很好.但是,如果我从任何其他目录调用agent.py,它显然无法导入checks.py等错误.

我如何确保可以导入自定义模块,无论从哪个例如调用agent.py

python /home/bob/scripts/agent/agent.py
Run Code Online (Sandbox Code Playgroud)

小智 30

实际上你的例子是有效的,因为checks.py与agent.py在同一个目录中,但是说checks.py在前面的目录中,例如;

agent/agent.py
checks.py
Run Code Online (Sandbox Code Playgroud)

然后你可以做以下事情:

path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if not path in sys.path:
    sys.path.insert(1, path)
del path
Run Code Online (Sandbox Code Playgroud)

注意使用__file__.

  • +1但对于像我这样的python新手,不要忘记添加'import os,sys'(没有引用)所以这样运行正常:) (3认同)

Joh*_*hin 12

你不应该使用sys.path.引用sys.path的Python 2.6文档:

在程序启动时初始化时,此列表的第一项path [0]是包含用于调用Python解释器的脚本的目录.如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),path [0]是空字符串,它指示Python首先搜索当前目录中的模块.请注意,在作为PYTHONPATH结果插入的条目之前插入了脚本目录.

=== amod.py ===
def whoami():
    return __file__

=== ascript.py ===
import sys
print "sys.argv", sys.argv
print "sys.path", sys.path
import amod
print "amod __file__", amod.whoami()

=== result of running ascript.py from afar ===
C:\somewhere_else>\python26\python \junk\timport\ascript.py
sys.argv ['\\junk\\timport\\ascript.py']
sys.path ['C:\\junk\\timport', 'C:\\WINDOWS\\system32\\python26.zip', SNIP]
amod __file__ C:\junk\timport\amod.py
Run Code Online (Sandbox Code Playgroud)

如果重新运行,最后一行当然会改为... amod.pyc.这似乎并不新颖,它适用于Python 2.1和1.5.2.

调试提示:尝试两个简单的文件,就像我一样.尝试使用-v和-vv运行Python.向我们展示失败测试的结果,包括完整的回溯和错误消息,以及您的两个文件.告诉我们你正在运行什么平台,以及什么版本的Python.检查checks.py文件的权限.是否有导致干扰的checks.something_else?


Chr*_*her 7

您需要将当前正在执行的模块的路径添加到sys.path变量中.由于您在命令行上调用它,因此脚本的路径将始终位于sys.argv [0]中.

import sys
import os
sys.path.append(os.path.split(sys.argv[0])[0])
Run Code Online (Sandbox Code Playgroud)

现在,当导入搜索模块时,它还将查找托管agent.py文件的文件夹.


S.L*_*ott 5

有几种方法可以添加东西PYTHONPATH.

阅读http://docs.python.org/library/site.html

  1. PYTHONPATH在运行脚本之前设置环境变量.

    你可以这样做从你的python -m agent运行.agent.pyPYTHONPATH

  2. .pthlib/site-packages目录中创建文件.

  3. 安装模块lib/site-packages.