繁体   English   中英

当模块名称中包含“-”破折号或连字符时如何导入模块?

[英]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")

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

你不能。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM