首页 > 编程问答 >importlib.import_module() 从多个子文件夹导入模块,但仅识别顶级目录

importlib.import_module() 从多个子文件夹导入模块,但仅识别顶级目录

时间:2024-07-25 13:21:55浏览次数:10  
标签:python python-3.x

我使用 importlib.import_module() 从不同的文件夹导入模块,但它只识别顶级目录名称。这是我的环境。

test目录下有a、b、c三个文件夹

(py312) root@ubuntu2004-host:~# tree test/
test/
├── a
│   ├── aa
│   │   └── aaa
│   │       └── aaaa
│   └── a.py
├── b
└── c
    └── cxxx.py

6 directories, 2 files

a.py的代码如下

import importlib
import sys

print(sys.path)
params=importlib.import_module('c.cxxx')
params.args
params.C

c.py的代码如下

args = {'a': 1}

class C:
def C(self):
  pass

时执行a.py总是报错 ModuleNotFoundError: No module named 'c' ,也就是说识别的是目录c而不是模块cxxx

(py312) root@ubuntu2004-host:~/test# python3.12 a/a.py 
['/root/test/a', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/usr/local/lib/python3.12/dist-packages', '/usr/lib/python3/dist-packages']
Traceback (most recent call last):
  File "/root/test/a/a.py", line 5, in <module>
    params=importlib.import_module('c.cxxx')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1324, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'c'

原来的python版本是3.11。我也尝试了Python 3.12.4和3.8,但它们也给出了同样的错误。


问题在于 Python 的模块导入机制。当你执行 importlib.import_module('c.cxxx') 时,Python 会将 "c" 解释为一个顶级的包名,而不是相对于当前文件路径的子目录。

为了解决这个问题,你需要将 "test" 目录添加到 Python 的搜索路径中,或者使用相对导入。

方法一:添加 "test" 目录到 Python 搜索路径

import importlib
import sys

# 将 "test" 目录添加到 sys.path
sys.path.append('/root/test')

# 导入模块
params = importlib.import_module('c.cxxx')

# 使用模块
params.args
params.C

这个方法将 "test" 目录添加到 sys.path 中,这样 Python 就能找到其中的模块了。

方法二:使用相对导入

from ..c import cxxx

# 使用模块
cxxx.args
cxxx.C

这个方法使用了相对导入, .. 表示上一级目录,即 "test" 目录。这样 Python 就会在 "test/c" 目录下找到 cxxx.py 模块。

注意事项:

  • 方法一需要修改 sys.path ,可能会影响到其他模块的导入。
  • 方法二只能在包内部使用,不能在包外部使用。

建议根据你的实际情况选择合适的方法。

标签:python,python-3.x
From: 78791513

相关文章

  • Python PDF 编辑器
    我将制作一个PDF编辑器,它可以更改PDF中的单词,而无需更改文本的来源。这是我的代码,到目前为止,它所做的一切都是正确的,但我可以获得文本颜色和文本大小。importpymupdfimportos#OpenthePDFdocumentdoc=pymupdf.open('input.pdf')#Loadthecustomfontfi......
  • JSON 响应中的字符串值变成 Python pandas datafram 中的数值
    我正在使用Python从RESTAPI中提取数据并将其存储在SQL数据库中。除了响应中的一个JSON值之外,一切工作正常。JSON响应[{"pbxId":"XXXcxx","site":"XXXGroup-SydneyOffice","name":"XXXXService","extension":......
  • 适用于 Python 的 Firebase-admin sdk 引发错误“StreamGenerator”不可迭代
    以前(一周前)我与Firestore通信的Python代码工作得很好。但今天我又开始研究它,它在迭代collection.stream()service_account=credentials.Certificate('credential/serviceAccount.json')firebase_admin.initialize_app(service_account)firestore_d......
  • 从 DOCKER 下的共享卷在 Linux 中执行 PyInstaller 生成的文件时出现 Python 子进程 F
    我已经使用PyInstaller生成了一个可执行文件,例如test(没有扩展名,因为它是Linux)并将其存储在一个目录中,例如data我有一个Python程序,如下所示:importsubprocessfrompathlibimportPath...defrun_exe():try:#getcurrentdirectory......
  • 从源代码安装 python3.5 后如何修复 virtualenv 的 python pip 分段错误(核心转储)响应
    背景嗨,我的主要目标是为许多使用旧版本Python的项目创建一个virtualenv,这些项目与系统版本(3.10.x)是分开的。我是使用PopOS22.04并进行所有更新。由于此错误,我什至无法使用pip。我也阅读了周围的内容,但我读到的所有解决方案要么输出日志文件,要么......
  • 无法使用适用于 Azure AI 搜索的 Python SDK 将数据添加到 ComplexField
    我想将带有嵌套字典的有效负载上传到AzureAI搜索索引。我在索引中使用ComplexField作为负载中的嵌套字典。索引无法识别嵌套字典,并且出现空错误。这是我的代码:ComplexField,CorsOptions,SearchIndex,ScoringProfile,SearchFieldDataType,Sim......
  • 如何使用 Python 从 Square 中的创建客户方法中检索客户 ID
    我正在square创建一个客户并得到如下结果。我需要的是获取客户的id。我的代码:fromsquare.clientimportClientclient=Client(access_token=settings.SQUARE_ACCESS_TOKEN,environment=settings.SQUARE_ENVIRONMENT,)api_customers=client.customers......
  • 为什么从.导入Python
    我使用的存储库的结构如下:在myrepo/src/中有:主要.pycore.py和somepkgsomepkg有init.py和其他python文件。somepkg不是任何文件中的类或函数。在main.py中,我看到:from.importcorefrom.importsomepkg我的问题是from和.......
  • 使用 Python 中的 Square API 检索客户 ID
    我正在为Square开发一个客户创建表单,它将创建一个客户,然后立即检索他们的ID以在程序中进一步使用。但是,我不知道如何使用API来过滤使用list_customers命令返回的数据。我找到了这篇文章:HowtoretrievecustomeridfromcreatecustomermethodinSquareusing......
  • 如何通过在字符串中使用 \u 或 \U 转义来正确表示 python3 (3.6.1+) 中的补充 unico
    最近我正在学习python,在python3中遇到了unicode转义文字的问题。似乎像Java一样,\u转义被解释为Java使用的UTF-16代码点,但问题来了:例如,如果我尝试放置3个字节的utf-8字符,例如“♬”(https://unicode-table.com/en/266C/),甚至是补充unicode字符,例如“......