我想导入foo-bar.py,这是有效的:
foobar = __import__("foo-bar")
这不是:
from "foo-bar" import *
我的问题:有没有办法,我可以使用上面的格式,即从“foo-bar”导入*导入一个模块,其中有一个- ?
我想导入foo-bar.py,这是有效的:
foobar = __import__("foo-bar")
这不是:
from "foo-bar" import *
我的问题:有没有办法,我可以使用上面的格式,即从“foo-bar”导入*导入一个模块,其中有一个- ?
当前回答
解决方案:如果你不能重命名模块以匹配Python命名约定,创建一个新模块作为中介:
新模块foo_proxy.py:
tmp = __import__('foo-bar')
globals().update(vars(tmp))
导入main.py的模块:
from foo_proxy import *
其他回答
这是我的场景:我在一个git子模块中克隆了一个python库,它的名称中有一个破折号:
|- python-my-lib
| `- mylib.py
`- my-script.py
我花了很长时间才算出等价物:
# Do NOT use this!
sys.path.insert(1, './my-lib')
from mylib import MyClass
附加路径不是一个选项,因为它只有在相同目录中运行脚本时才有效。如果执行/home/user/bin/my-script.py,则会失败。
这就是解决方案:
import importlib
mylib_module = importlib.import_module("python-my-lib.mylib")
MyClass = mylib_module.MyClass
如果您知道更简单的解决方案,请随意进一步改进此解决方案。
在Python 2中,你不能这样做。Foo-bar不是一个标识符。将文件重命名为foo_bar.py
从Python 3.1+开始,这是可能的,参见Julien的回答。
如果导入不是你的目标(比如:你不关心sys. import会发生什么。模块,你不需要它导入自己),只是把文件的所有全局变量放到你自己的作用域,你可以使用execfile
# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>>
从Python 3.1开始,你可以使用importlib:
import importlib
foobar = importlib.import_module("foo-bar")
(https://docs.python.org/3/library/importlib.html)
如果你不能重命名原始文件,你也可以使用符号链接:
ln -s foo-bar.py foo_bar.py
然后你可以这样做:
from foo_bar import *
解决方案:如果你不能重命名模块以匹配Python命名约定,创建一个新模块作为中介:
新模块foo_proxy.py:
tmp = __import__('foo-bar')
globals().update(vars(tmp))
导入main.py的模块:
from foo_proxy import *