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

1 投票
1 回答
1479 浏览
提问于 2025-04-18 05:07

我有一个脚本 script.py,还有多个模块在不同的文件夹里,这些模块之间是相互依赖的。为了简单起见,我们只看其中两个模块,module1.pymodule2.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

撰写回答