当模块名称中带有'-'破折号或连字符时,如何导入模块?


194

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

foobar = __import__("foo-bar")

这不是:

from "foo-bar" import *

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


10
为什么您的模块名称中带有破折号?
Matti Virkkunen 2011年

23
我猜它最初是作为脚本而不是模块编写的。
Michael Hoffman


win32com的@MattiVirkkunen makepy.py将生成带破折号的模块。太糟糕了。comtypes通过将其转换为下划线解决了这一问题
swdev 2014年

2
@MattiVirkkunen我认为Python不应限制我可以给目录的名称。这样做不是其责任。
Zelphir Kaltstahl '16

Answers:


116

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

编辑:如果import不是您的目标(例如:您不在乎会发生什么sys.modules,您不需要导入自身),只需将文件的所有全局变量放入自己的作用域即可,您可以使用execfile

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

24
Python 3.x Python 3.0的新增功能删除了execfile()。代替execfile(fn)使用exec(open(fn).read())另外还有包importlib。
DevPlayer 2015年

104

如果您不能重命名模块以匹配Python命名约定,请创建一个新模块以充当中介:

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

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

28
我永远都不会实现。但是,我不能因为这种骇客的光彩而给+1
inspectorG4dget

11
您实际上可以在没有foo_proxy.py文件的情况下执行此操作,将的输出分配__import__(...)sys.modules['foo_proxy']。实际上,不要那样做,这是一个糟糕的主意。
SingleNegationElimination

3
酷我想要的东西。如果一个人使用发行版附带的本机库,则有一个用例。
斯文


46

如果您不能重命名原始文件,则还可以使用符号链接:

ln -s foo-bar.py foo_bar.py

然后,您可以:

from foo_bar import *

2

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

例如,如果您的结构是这样的:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

import barfoo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.