如何通过python中的一个符号链接导入多个文件?

时间:2014-05-02 11:19:37

标签: python python-2.7 import environment-variables pythonpath

我有一个脚本script.py和一个不同目录中的多个模块,它们都相互依赖。为简单起见,我们只看其中两个,module1.pymodule2.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 module2sys.path包含符号链接的目录,而不是文件! 为什么?我该如何解决这个问题?



所有代码:

如果您想亲自尝试,我认为您可能需要这样做。

的MyScript / script.py:

#!/usr/bin/env python

import module1

mymodules / module1.py

#!/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

mymodules / module2.py

#!/usr/bin/env python

print "import successful!"

1 个答案:

答案 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