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')))