如何在Python中从带短横线的同级文件夹调用函数?
带短横线文件夹的Python模块导入解决方案
问题场景
目录结构如下:
├── folderA │ └── A.py └── folder-B └── B.py
folder-B/B.py 代码:
def methodB(): return "\n\nThis is methodB from Folder-B"
folderA/A.py 初始代码:
import sys sys.path.append("..") from folder-B.B import methodB s = methodB() print(s)
执行 python A.py 时触发语法错误:
File "A.py", line 3
from folder-B.B import methodB
^ SyntaxError: invalid syntax
原因:Python的标识符(包/模块名)不允许包含短横线,解析器会把folder-B误判为folder - B的运算表达式,导致语法错误。
解决方案(保留短横线文件夹名)
方法1:使用importlib.import_module动态导入
这是官方推荐的处理特殊命名模块的方式,修改A.py代码如下:
import sys import importlib # 将上级目录加入模块搜索路径 sys.path.append("..") # 直接导入目标模块 b_module = importlib.import_module("folder-B.B") # 调用模块中的函数 s = b_module.methodB() print(s)
方法2:使用__import__函数(兼容旧版本Python)
如果使用Python 3.4之前的版本,可以用内置的__import__函数:
import sys sys.path.append("..") # 导入folder-B.B模块 b_module = __import__("folder-B.B", fromlist=["methodB"]) s = b_module.methodB() print(s)
补充写法
如果希望更贴近常规导入逻辑,也可以分步导入:
import sys import importlib sys.path.append("..") # 先导入folder-B包 folder_b = importlib.import_module("folder-B") # 再导入包内的B模块 b_module = importlib.import_module("B", package="folder-B") s = b_module.methodB() print(s)
内容的提问来源于stack exchange,提问作者ailauli69
相关产品推荐
相关产品推荐

