Python - 导入包失败

Posted

技术标签:

【中文标题】Python - 导入包失败【英文标题】:Python - fails importing package 【发布时间】:2017-08-08 18:44:15 【问题描述】:

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

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

【问题讨论】:

Adding folder to Python's path permanently的可能重复 【参考方案1】:

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

相对导入

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

您还需要运行从包外部导入的脚本,例如通过导入它并从那里运行它,而不是直接运行 cmp2locus.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路径。

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

【讨论】:

谢谢@Blimmo。我喜欢相对进口的想法。我实际上正在运行 Python2.7。如果我尝试您的suggestion:from ..modelmaker import command_file,我会收到以下错误:ValueError: Attempted relative import in non-package。我需要在我的 init.py 中有什么特别的东西才能让它工作吗?还是Python2.7阻止了它? 我刚刚意识到评论“而不仅仅是运行 cmp2locus.py”。如果我想在该特定模块中使用,我不确定我应该从哪里导入它。 @duanerf 你只需要调用你想要从其他地方进行导入的脚本,脚本仍然可以使用其中的导入。这是因为 python 包不应该自己运行,只是使用。因此,您可以在仅包含 import filelib.converters.cmp2locus 的包之外创建一个 run.py。这将从允许加载包的外部运行脚本。 This 可能有用。【参考方案2】:

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

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

【讨论】:

谢谢@Meera。但是,这似乎不会永久添加路径。这意味着我需要始终在我的代码中添加这个sys.path.append。我觉得这很奇怪,从来没有注意到这是必要的。有没有办法在 sys.path 中永久添加我的 filelib 包,然后导入该库中的任何内容?

以上是关于Python - 导入包失败的主要内容,如果未能解决你的问题,请参考以下文章

解决python在cmd运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"

Python:导入KMeans库失败;Kmeans报错及解决方法;NameError: name ‘KMeans‘ is not defined

Pygame模块在Pycharm导入失败解决

vscode安装拓展插件失败 要求手动安装, 手动下载后导入安装仍然失败。(Error when installing ‘Python‘ extension. Please check the)

python 3.5(Anaconda 包)上的 Pymssql 问题:Dll 加载失败:找不到特定模块

maven自动导入包失败