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

时间:2012-01-05 20:13:13

标签: python import symlink

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

如果我将整个文件夹A复制到其他文件夹B并在那里创建一个带有“import A”的文件,它就可以了。但现在我删除文件夹并移动到原始文件夹的符号链接。现在它不起作用,说“没有名为foo的模块”。 有谁知道如何使用符号链接进行导入?

2 个答案:

答案 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) } } 链接检查它们是否正确,并观察预期的目录内容。