Python-导入packag失败

2024-06-17 07:54:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我在导入包时遇到问题。 我的文件结构如下:

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


Tags: 模块文件frompyimportinit选项结构
2条回答

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

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

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

相对进口

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

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

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

import filelib.modelmaker.command_file

变成

from ..modelmaker import command_file

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

另见the PEP

绝对进口

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

修改python路径

正如Meera所回答的,您还可以使用sys直接修改python路径。

我个人不喜欢这个选项,因为它感觉非常“老套”,但有人告诉我,它可以很有用,因为它可以让你精确控制什么你可以进口。

相关问题 更多 >