我知道这个问题已经被问过多次了。我已经阅读了所有内容,但无法解决问题。以下是我的目录结构。
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 文档。
您的包裹结构还可以。您的导入声明很好。唯一缺少的是该软件包在中是可见的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"]