当模块名称中包含“ - ”破折号或连字符时,如何导入模块?

时间:2011-12-02 01:56:49

标签: python import module hyphen

我想导入foo-bar.py。这有效:

foobar = __import__("foo-bar")

这不是:

from "foo-bar" import *

我的问题:我有什么方法可以使用上述格式,即from "foo-bar" import *导入其中包含-的模块?

6 个答案:

答案 0 :(得分:95)

你不能。 foo-bar不是标识符。将文件重命名为foo_bar.py

修改import不是您的目标(如:您不关心sys.modules会发生什么,您不需要它自己导入) ,只需将所有文件的全局变量放入自己的范围,就可以使用execfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 

答案 1 :(得分:86)

如果您无法重命名模块以匹配Python命名约定,请创建一个新模块作为中介:

 ---- foo_proxy.py ----
 tmp = __import__('foo-bar')
 globals().update(vars(tmp))

 ---- main.py ----
 from foo_proxy import * 

答案 2 :(得分:45)

如果您无法重命名原始文件,也可以使用符号链接:

ln -s foo-bar.py foo_bar.py

然后你可以:

from foo_bar import *

答案 3 :(得分:24)

从Python 3.1开始,您可以使用importlib:

import importlib  
foobar = importlib.import_module("foo-bar")

https://docs.python.org/3/library/importlib.html

答案 4 :(得分:1)

就像其他人说的那样,您不能在python命名中使用“-”,有许多解决方法,如果您必须从路径添加多个模块,则使用这样的解决方法非常有用sys.path

例如,如果您的结构如下:

foo-bar
├── barfoo.py
└── __init__.py

import sys
sys.path.append('foo-bar')

import barfoo

答案 5 :(得分:0)

在 Python 3.6 中 直接

时我遇到了同样的问题“invalid syntax
import 'jaro-winkler' as jw

说 使用“No module named 'jaro-winkler'”时:

jw = __import__('jaro-winkler')

importlib.import_module()相同。

最后我使用 pip 卸载 jaro-winkler 模块...仅供参考