![](/img/trans.png)
[英]How to import a module that has a dash “-” in its name without renaming it
[英]How to import module when module name has a '-' dash or hyphen in it?
我想导入foo-bar.py
,这可行:
foobar = __import__("foo-bar")
这不会:
from "foo-bar" import *
我的问题:有什么方法可以使用上述格式,即from "foo-bar" import *
来导入包含-
的模块?
从 Python 3.1 开始,可以使用 importlib:
import importlib
foobar = importlib.import_module("foo-bar")
你不能。 foo-bar
不是标识符。 将文件重命名为foo_bar.py
编辑 2:对于 python 3.1+,请参阅 Julien 的回答。
编辑:如果import
不是您的目标(例如:您不在乎sys.modules
发生了什么,您不需要它自己导入),只需将所有文件的全局变量放入您自己的 scope 中,您可以使用execfile
# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>>
如果您无法重命名模块以匹配 Python 命名约定,请创建一个新模块作为中介:
---- foo_proxy.py ----
tmp = __import__('foo-bar')
globals().update(vars(tmp))
---- main.py ----
from foo_proxy import *
如果您无法重命名原始文件,您也可以使用符号链接:
ln -s foo-bar.py foo_bar.py
然后你可以:
from foo_bar import *
就像其他人说的那样,您不能在 python 命名中使用“-”,有很多解决方法,如果您必须从路径添加多个模块,其中一种解决方法是使用sys.path
例如,如果您的结构是这样的:
foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')
import barfoo
这是我的场景:我在 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 3.6 中我直接遇到了同样的问题“ invalid syntax
”
import 'jaro-winkler' as jw
使用时说“ No module named 'jaro-winkler'
”:
jw = __import__('jaro-winkler')
和importlib.import_module()
一样。
最后我使用 pip 卸载jaro-winkler
模块...仅供参考
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.