如何在Python中通过一个符号链接导入多个文件?
我有一个脚本 script.py
,还有多个模块在不同的文件夹里,这些模块之间是相互依赖的。为了简单起见,我们只看其中两个模块,module1.py
和 module2.py
,其中第一个模块会导入第二个模块。所有这些模块都需要在 script.py
中使用。
现在我在 script.py
的目录里添加了一个指向 module1.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
里包含的是符号链接的目录,而不是文件!这是为什么呢?我该怎么解决这个问题?
所有代码:
我想你可能需要这些代码,如果你想自己试试的话。
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 个回答
1
简单来说,就是把真实的目录名加到 sys.path
里。
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
这个输出是
import successful
不过,当符号链接的 module1.py
被编译成 module1.pyc
后,module1.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