ImportError:没有名为<something>的模块

Ank*_*tia 7 python

我知道这个问题已经被问过多次了。我已经阅读了所有内容,但无法解决问题。以下是我的目录结构。

ankur
     --ankur1
             __init__.py
             util.py
     --ankur2
             main.py
     --__init__.py
Run Code Online (Sandbox Code Playgroud)

在main.py中,我将导入以下内容。

import ankur.ankur1.util
Run Code Online (Sandbox Code Playgroud)

当我在Windows中执行代码时,它可以很好地工作。但是在Linux中,出现以下错误。

ImportError: No module named ankur.ankur1.util
Run Code Online (Sandbox Code Playgroud)

我还阅读了有关模块和包的官方python 文档

wim*_*wim 9

您的包裹结构还可以。您的导入声明很好。唯一缺少的是该软件包在中是可见的sys.path,该位置是可以解析import语句的位置列表。

通常,我们通过在本地“安装”软件包来完成此操作pip,这会将您的代码复制到site-packages †中。该目录是中的条目之一sys.path,因此,当您将代码安装在站点程序包中时,现在可以照常解析import语句。

但是,要安装代码,您需要为该软件包定义一个安装程序(setup.py脚本)或构建系统(pyproject.toml文件)。您的项目似乎没有任何安装程序或构建系统,因此您需要创建一个安装程序或构建系统(有关详细信息,请参阅《Python打包用户指南》),然后使用来安装软件包pip。如果您现在还不想学习Python封装,则需要找到另一种方法。

可以sys.path直接在中进行修改main.py,这随后使语句import ankur.ankur1.util得以解析。这很骇人,我建议不要这样做。它将增加限制,即执行main.py是包其余部分的唯一入口点,因此任何其他想要的代码import ankur首先都需要知道main.py文件系统上的路径。那是一个凌乱的方法,应该避免。

解决该问题的另一种方法是使用环境-有一个环境变量PYTHONPATH,可用于增加模块文件的默认搜索路径。在您的外壳中:

export PYTHONPATH=/path/to/parent
Run Code Online (Sandbox Code Playgroud)

其中parent是包含ankur子目录的目录。

网站软件包的确切位置取决于您的操作系统/平台,但是您可以通过import sysconfig; sysconfig.get_paths()["purelib"]

  • 为什么我们不应该直接在代码中修改`sys.path`?[此高度评价的答案](/sf/answers/306851821/)直接修改程序中的python路径。 (2认同)
  • 它很混乱,通常没有必要,而且扩展性不好。在每个导入语句中都会搜索“sys.path”中的每个条目。因此,如果安装的每个库都决定插入到“sys.path”中,而不是像往常一样安装到 site-packages 目录中,那么导入系统就会变得缓慢且笨拙。甚至[来自回答者的评论](/sf/ask/306850001/ Different-folder/4383597#comment53217573_4383597)警告这不是一个好的解决方案。避免插入“sys.path”,除非您确实需要在站点包之前首先搜索一个位置。 (2认同)