我有一个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__.
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?
您需要将当前正在执行的模块的路径添加到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文件的文件夹.
有几种方法可以添加东西PYTHONPATH.
阅读http://docs.python.org/library/site.html
PYTHONPATH在运行脚本之前设置环境变量.
你可以这样做从你的python -m agent运行.agent.pyPYTHONPATH
.pth在lib/site-packages目录中创建文件.
安装模块lib/site-packages.
| 归档时间: |
|
| 查看次数: |
65389 次 |
| 最近记录: |