当模块名中有'-'破折号还是连字符?

我想导入foo-bar.py,这是有效的:

foobar = __import__("foo-bar")

这不是:

from "foo-bar" import *

我的问题:是否有任何方法可以使用上面的格式,即from "foo-bar" import *导入一个有-的模块?

170225 次浏览

Python 2中,你不能。foo-bar不是一个标识符。将文件重命名为foo_bar.py


这是可能的,因为Python 3.1 +,见朱利安的回答


如果import不是你的目标(比如:你不关心sys.modules发生了什么,你不需要它导入自己),只需要将文件的所有全局变量放入你自己的作用域,你可以使用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 3.1开始,你可以使用importlib:

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

(__abc0)

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

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

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


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


import barfoo

在Python 3.6 我也有同样的问题"当直接< / p >

import 'jaro-winkler' as jw
< p >表示 “No module named 'jaro-winkler'"当使用:< / p >
jw = __import__('jaro-winkler')

importlib.import_module()相同。

最后我使用pip卸载jaro-winkler模块…仅供参考

这是我的场景:我在一个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在dash -上有问题。所以改用importlib。 您可以像这样运行您的测试脚本-

# importlib, because python has issues with dash '-' in module names
import importlib
img2txt = importlib.import_module("img2txt-textextractor")


event_with_txt = {...}


event_with_no_txt = {...}




def test_no_text():
response = img2txt.handler(event=event_with_txt, context='')
assert response["body"] == '"Detect Me If You Can. "'


def test_detected_text():
response = img2txt.handler(event=event_with_no_txt, context='')
assert response["body"] == '"unable to find anything"'

将测试代码命名为test_someName.py。从终端类型-上的相同目录运行

pytest