Python - 无法导入包

时间:2017-03-17 09:25:10

标签: python python-import python-module python-packaging

我无法导入包。 我的文件结构是这样的:

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 ... 感谢解决这个问题的任何暗示。我不明白为什么这个导入不起作用。

2 个答案:

答案 0 :(得分:0)

要从其他文件夹导入,您必须将该文件夹的路径追加到sys.path

import sys
sys.path.append('path/filelib/modelmaker')
import command_file

答案 1 :(得分:0)

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

相对进口

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

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

然后,您需要使用..将导入更改为相对 所以:

import filelib.modelmaker.command_file

变为

from ..modelmaker import command_file

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

另见the PEP

绝对进口

如果您将包放在site-packagessite.getsitepackages()返回的目录)中,您将能够使用您尝试在问题中使用的导入格式。请注意,这需要您的软件包的任何用户也在那里安装它,所以这不是理想的(虽然他们可能会,依赖它是不好的)。

修改python路径

Meera回答时,您也可以使用sys。

直接修改python路径

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