277

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

foobar = __import__("foo-bar")

这不会:

from "foo-bar" import *

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

4

6 回答 6

177

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

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

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

于 2018-11-28T10:13:15.953 回答
143

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

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

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 
于 2011-12-02T02:00:45.763 回答
126

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

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

 ---- main.py ----
 from foo_proxy import * 
于 2011-12-02T02:09:36.650 回答
49

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

ln -s foo-bar.py foo_bar.py

然后你可以:

from foo_bar import *
于 2014-01-09T16:14:09.580 回答
10

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

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

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

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

import barfoo
于 2019-04-11T08:01:33.450 回答
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模块...仅供参考

于 2021-04-21T08:19:40.417 回答