我有一个文件夹A,其中包含一些Python文件和__init __。py。
如果我将整个文件夹A复制到其他文件夹B并在那里创建一个带有“import A”的文件,它就可以了。但现在我删除文件夹并移动到原始文件夹的符号链接。现在它不起作用,说“没有名为foo的模块”。 有谁知道如何使用符号链接进行导入?
答案 0 :(得分:9)
Python不会检查你的文件是否是符号链接!您的问题可能在于重命名模块或在搜索路径中没有它们!
如果ModuleA成为ModuleB并且您尝试导入ModuleA,则无法找到它,因为它不存在。
如果您将ModuleA移动到另一个目录并且生成一个带有另一个名称的符号链接(表示新目录),则此新目录必须是脚本和模块的公共父目录,或者symlink目录必须在搜索中路径。
顺便说一下,你不清楚你的意思是模块还是包装。包含__init__.py
文件的目录将成为所有文件的包,其中包含.py
(= modules)扩展名。
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
会将包名称,而不是包中的模块导入您的命名空间!
答案 1 :(得分:4)
如果您的符号链接设置不正确,可能会发生此类行为。例如,如果您使用相对文件路径创建它们。在这种情况下,符号链接将在没有错误的情况下创建,但不会指向任何有意义的内容。
如果这可能是导致错误的原因,请使用完整路径创建链接,并通过class Application extends GrailsAutoConfiguration {
static void main(String[] args) {
GrailsApp.run(Application, args)
}
void doWithApplicationContext() {
ConstrainedProperty.removeConstraint(ConstrainedProperty.VALIDATOR_CONSTRAINT)
ConstrainedProperty.registerNewConstraint(ConstrainedProperty.VALIDATOR_CONSTRAINT, NamespaceValidatorConstraint.class)
}
}
链接检查它们是否正确,并观察预期的目录内容。