如何导入文件夹的符号链接到Python中?

22

我有一个文件夹 A,其中包含一些 Python 文件和 __init__.py。

如果我将整个文件夹 A 复制到另一个文件夹 B 中并创建一个带有 "import A" 的文件,它可以工作。但现在我删除了文件夹并添加了一个指向原始文件夹的符号链接。现在它无法工作,提示 "No module named foo"。有人知道如何使用符号链接进行导入吗?

2个回答

17

Python不会检查你的文件是否是符号链接!你的问题可能在于重命名模块或者没有将它们添加到搜索路径中!

如果ModuleA变成了ModuleB并且你试图导入ModuleA,那么它会找不到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

导入packagename将包,但不是包中的模块导入到您的命名空间!


我认为这个答案可能只适用于在Windows下运行Python。 在我的Mac上似乎Python确实会检查文件是否是符号链接。(https://dev59.com/InNA5IYBdhLWcg3wmfIa#38403654) - Ogen

11
这种行为可能会发生,如果您的符号链接没有正确设置。例如,如果您使用相对文件路径创建它们,则会创建符号链接,但不会指向任何有意义的位置。
如果这可能是错误的原因,请使用完整路径来创建链接,并通过ls链接并观察预期的目录内容来检查它们是否正确。

我刚刚陷入了这个,谢谢! - davidlatwe
为了充实这个答案,在创建符号链接时,请确保使用ln -s "$PWD/path/to/fileordir" "$PWD/path/to/symlink" - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接