Bal*_*ala 160 python import module hyphen
我想导入foo-bar.py.这有效:
foobar = __import__("foo-bar")
Run Code Online (Sandbox Code Playgroud)
这不是:
from "foo-bar" import *
Run Code Online (Sandbox Code Playgroud)
我的问题:有什么方法可以使用上面的格式,即from "foo-bar" import *
导入一个包含其中的模块-
?
Sin*_*ion 110
你不能. foo-bar
不是标识符.将文件重命名为foo_bar.py
编辑:如果import
不是你的目标(如:你不在乎什么情况sys.modules
,你不需要它导入自己),刚开所有文件的全局变量到你自己的范围,你可以使用execfile
# contents of foo-bar.py
baz = 'quux'
Run Code Online (Sandbox Code Playgroud)
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>>
Run Code Online (Sandbox Code Playgroud)
Ray*_*ger 92
如果您无法重命名模块以匹配Python命名约定,请创建一个新模块以充当中介:
---- foo_proxy.py ----
tmp = __import__('foo-bar')
globals().update(vars(tmp))
---- main.py ----
from foo_proxy import *
Run Code Online (Sandbox Code Playgroud)
Jul*_*ien 60
从Python 3.1开始,您可以使用importlib:
import importlib
foobar = importlib.import_module("foo-bar")
Run Code Online (Sandbox Code Playgroud)
(https://docs.python.org/3/library/importlib.html)
git*_*rik 45
如果您无法重命名原始文件,还可以使用符号链接:
ln -s foo-bar.py foo_bar.py
Run Code Online (Sandbox Code Playgroud)
然后你可以:
from foo_bar import *
Run Code Online (Sandbox Code Playgroud)
就像其他人说的,你不能在 python 命名中使用“-”,有很多变通方法,如果你必须从一个路径中添加多个模块,一个这样的变通方法会很有用正在使用 sys.path
例如,如果您的结构是这样的:
foo-bar
??? barfoo.py
??? __init__.py
Run Code Online (Sandbox Code Playgroud)
foo-bar
??? barfoo.py
??? __init__.py
Run Code Online (Sandbox Code Playgroud)