Python子模块导入

Python子模块导入,python,importerror,Python,Importerror,我试着阅读其他类似的问题,但答案对我来说不起作用,比如 我的文件夹结构如下: python_scripts ├── lib │ ├── __init__.py # import lib.talk │ └── talk.py # def sayhello(x): print(x) │ ├── src │ ├── __init__.py # import lib.talk │ └── data │ ├── __init__.py

我试着阅读其他类似的问题,但答案对我来说不起作用,比如

我的文件夹结构如下:

python_scripts
├── lib
│   ├── __init__.py      # import lib.talk
│   └── talk.py          # def sayhello(x): print(x)
│   
├── src
│   ├── __init__.py      # import lib.talk
│   └── data
│       ├── __init__.py  # import lib.talk
│       └── main.py      # from lib.talk import sayhello
│                          sayhello('hi')
│
└── __init__.py          # import lib.talk
这会引发一个错误:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from lib.talk import sayhello
ModuleNotFoundError: No module named 'lib.talk'
回溯(最近一次呼叫最后一次):
文件“main.py”,第1行,在
从lib.talk导入sayhello
ModuleNotFoundError:没有名为“lib.talk”的模块
奇怪的是,如果我在main.py中简单地“导入lib”,就不会有错误。我应该如何解决这个问题


我使用的是Windows,我非常希望避免使用sys.path方法,因为我们不想硬编码路径(这可能会被其他团队在将来使用)。

在您的
main.py
文件中,在顶部添加以下内容

import sys
path = r'{path_to_python_scripts}'

if path not in sys.path:
    sys.path.append(path)

# Now import
import lib


使用来自…lib import talk的
。您的
导入lib.talk
无法工作,因为lib是一个包,因为
\uuuu init\uuuuuuuuy
lib
字典中。 您也可以使用
path
追加方式,但您需要获得如下内容:

import os, sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'libs')))

这样,无论Python代码存储在何处,您都将始终动态地将path附加到LIB。

您好,谢谢您的回复。我尝试了这两种方法,但不幸的是,它仍然抛出一个错误:ImportError:无法导入名称“talk”My bad。我没有仔细查看你的目录树。我修改了我的答案。我给您的小建议是:当您构建类似这样的东西时,
main.py
应该位于主目录中,因此从子目录/子包导入的所有内容都将与此脚本相关。在您的解决方案中,您需要浏览目录树,其他人也会遇到查找
main.py
的问题。谢谢您的建议。我希望这个main.py是提取所有数据(因此在数据文件夹中)的脚本。实际应用程序的主目录中将有另一个app.py。也许我应该将main.py移到主目录并将其重命名为pull_data.py单独的数据文件和逻辑<代码>数据
文件夹应仅用于存储数据。里面没有Python文件。数据解析器应该在
lib
中,
main.py
应该在主目录中。这样,当您将解析器从lib目录导入main时,数据目录的路径仍然是相对于main.py的。它更容易维护。嗨,对不起,我误解了-第二个有效!非常感谢。
import os, sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'libs')))