2

我在导入包时遇到问题。我的文件结构是这样的:

filelib/  
    __init__.py
    converters/ 
        __init__.py
        cmp2locus.py
    modelmaker/ 
        __init__.py
        command_file.py

在模块command_file.py中,我有一个名为的类CommandFile,我想在cmp2locus.py模块中调用它。

我在cmp2locus.py模块中尝试了以下内容:

import filelib.modelmaker.command_file
import modelmaker.command_file
from filelib.modelmaker.command_file import CommandFile

所有这些选项都返回ImportError: No modules named ... 感谢有关解决此问题的任何提示。我不明白为什么这个导入不起作用。

4

2 回答 2

4

要执行这些导入,您有 3 个选项,我将按照我喜欢的顺序列出它们。(对于所有这些选项,我将假设 python 3)

相对进口

您的文件结构看起来像一个正确的包文件结构,因此这应该可以工作,但是尝试此选项的其他任何人都应该注意它要求您在一个包中;这不适用于某些随机脚本。

您还需要运行从包外部进行导入的脚本,例如通过导入它并从那里运行它,而不是直接运行 cmp2locus.py 脚本

然后您需要使用.. So 将您的导入更改为相对的:

import filelib.modelmaker.command_file

变成

from ..modelmaker import command_file

..指的是父文件夹(如文件系统中的隐藏文件)。另请注意,您必须使用from import语法,因为以开头的名称..在 python 中不是有效的标识符。但是,您当然可以将其导入为您喜欢使用的任何from import as.

另请参阅PEP

绝对进口

如果您将包放在site-packages中(由 返回的目录site.getsitepackages()),您将能够使用您在问题中尝试使用的导入格式。请注意,这需要您的软件包的任何用户也将其安装在那里,因此这并不理想(尽管他们可能会这样做,但依赖它是不好的)。

修改python路径

正如Meera回答的那样,您也可以使用 sys.path 直接修改 python 路径。

我个人不喜欢这个选项,因为它感觉非常“hacky”,但有人告诉我它很有用,因为它可以让您精确控制可以导入的内容。

于 2017-03-17T09:53:21.867 回答
2

要从另一个文件夹导入,您必须将该文件夹的路径附加到sys.path

import sys
sys.path.append('path/filelib/modelmaker')
import command_file
于 2017-03-17T09:40:43.730 回答