我想导入foo-bar.py。这有效:
foobar = __import__("foo-bar")
这不是:
from "foo-bar" import *
我的问题:我有什么方法可以使用上述格式,即from "foo-bar" import *
导入其中包含-
的模块?
答案 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")
答案 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
模块...仅供参考