Python:导入文件夹的符号链接
我有一个文件夹A,里面有一些Python文件和一个叫__init__.py的文件。
如果我把整个文件夹A复制到另一个文件夹B,然后在B里创建一个文件,里面写“import A”,这样是可以正常工作的。但是现在我把文件夹A删掉了,改成了指向原始文件夹的符号链接(symlink)。结果就不行了,提示说“没有名为foo的模块”。有没有人知道怎么用符号链接来导入模块呢?
2 个回答
11
这种情况可能是因为你的符号链接设置得不对。比如说,如果你是用相对路径来创建它们的。在这种情况下,符号链接虽然创建成功了,但它们指向的地方可能没有什么实际意义。
如果你觉得这可能是错误的原因,可以尝试用完整的路径来创建链接,并通过 ls
命令查看链接,确认它们指向的目录内容是否正确。
17
Python 不会检查你的文件是不是一个符号链接(symlink)!你遇到的问题可能是因为模块的重命名,或者这些模块不在你的搜索路径里!
如果 ModuleA 变成了 ModuleB,而你试图导入 ModuleA,Python 找不到它,因为 ModuleA 根本不存在。
如果你把 ModuleA 移动到了另一个文件夹,并且生成了一个新的符号链接,这个新的链接代表了一个新目录,那么这个新目录必须是你的脚本和模块的共同父目录,或者这个符号链接的目录必须在搜索路径里。
顺便说一下,不太清楚你是指模块还是包。包含 __init__.py
文件的目录就变成了一个包,里面所有扩展名为 .py
的文件都算是模块。
例子
DIRA
+ __init__.py <-- makes DIRA to package DIRA
+ moduleA.py <-- module DIRA.moduleA
移动和符号链接
/otherplace/DIRA <-+
| points to DIRA
mylibraries/SYMA --+ symbolic link
如果 SYMA 和 DIRA 的名字相同,而你的脚本在 SYMA 目录下,那么应该可以正常工作。如果不行,你需要:
import sys
sys.path.append('/path/to/your/package/root')
如果你想从你的包 SYMA 中导入一个模块,你必须:
import SYMA.ModuleA
一个简单的:
import SYMA
会导入包的名称,但不会把包里的模块导入到你的命名空间里!