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

foobar = __import__("foo-bar")

这不是:

from "foo-bar" import *

我的问题:有没有办法,我可以使用上面的格式,即从“foo-bar”导入*导入一个模块,其中有一个- ?


当前回答

解决方案:如果你不能重命名模块以匹配Python命名约定,创建一个新模块作为中介:

新模块foo_proxy.py:

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

导入main.py的模块:

 from foo_proxy import * 

其他回答

解决方案:如果你不能重命名模块以匹配Python命名约定,创建一个新模块作为中介:

新模块foo_proxy.py:

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

导入main.py的模块:

 from foo_proxy import * 

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

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

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

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

在Python 3.6中 我有同样的问题“无效的语法”时直接

import 'jaro-winkler' as jw

说 "没有名为'jaro-winkler'的模块"

jw = __import__('jaro-winkler')

importlib.import_module()也一样。

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

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


从Python 3.1+开始,这是可能的,参见Julien的回答。


如果导入不是你的目标(比如:你不关心sys. import会发生什么。模块,你不需要它导入自己),只是把文件的所有全局变量放到你自己的作用域,你可以使用execfile

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