Python:导入文件夹的符号链接

22 投票
2 回答
29514 浏览
提问于 2025-04-17 09:37

我有一个文件夹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

会导入包的名称,但不会把包里的模块导入到你的命名空间里!

撰写回答