我有一个脚本script.py
和一个不同目录中的多个模块,它们都相互依赖。为简单起见,我们只看其中两个,module1.py
和module2.py
,其中第一个导入后者。所有这些都应该由script.py
使用。
现在我将module1.py
的符号链接添加到script.py
目录中,因此我的目录树如下所示:
.
├── mymodules
│ ├── module1.py
│ └── module2.py
└── myscript
├── module1.py -> ../mymodules/module1.py
└── script.py
现在运行script.py
不起作用,因为PYTHONPATH
不包含mymodules
目录,因此module1
无法导入module2
。现在,有一个简单的解决方法;将module1.py
的路径追加到PYTHONPATH
:
sys.path.append(os.path.abspath(os.path.join(os.path.realpath(__file__),os.path.pardir)))
这就是出现问题的地方:这有效,但只有一次!
第一次运行正常,导入所有模块没有任何问题。
但是$ ./script.py
的每次后续执行都失败,异常ImportError: no module named module2
和sys.path
包含符号链接的目录,而不是文件! 为什么?我该如何解决这个问题?
如果您想亲自尝试,我认为您可能需要这样做。
#!/usr/bin/env python
import module1
#!/usr/bin/env python
import sys, os
#append directory of this file to PYTHONPATH
sys.path.append(os.path.abspath(os.path.join(os.path.realpath(__file__),os.path.pardir)))
#print for control reasons
print sys.path
import module2
#!/usr/bin/env python
print "import successful!"
答案 0 :(得分:1)
简单地说,append
sys.path
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
此输出
import successful
但是,在将符号module1.py
编译为module1.pyc
后,modeul1.pyc
将位于myscript
。上面的代码不起作用。
因此解决方法是将mymodules/module1.py
修改为
import os
import sys
srcfile = __file__
if srcfile.endswith('.pyc'):
srcfile = srcfile[:-1] # pyc to py
sys.path.append(os.path.dirname(os.path.realpath(srcfile)))
import module2