我想导入foo-bar.py,这是有效的:
foo-bar.py
foobar = __import__("foo-bar")
这不会:
from "foo-bar" import *
我的问题:是否有任何方法可以使用上面的格式,即from "foo-bar" import *来导入其中包含-的模块?
-
u59ebvdq1#
从Python 3.1开始,您可以使用importlib:
import importlib foobar = importlib.import_module("foo-bar")
(https://docs.python.org/3/library/importlib.html)
06odsfpq2#
在Python 2中,您不能。foo-bar不是标识符。将文件重命名为foo_bar.py这是可能的,因为Python 3.1+,请参阅Julien's answer。如果import不是你的目标(比如:你不在乎sys.modules会发生什么,你不需要它来导入自己),只要把文件的所有全局变量都放到你自己的范围内,你就可以使用execfile
foo-bar
foo_bar.py
import
sys.modules
execfile
# contents of foo-bar.py baz = 'quux'
>>> execfile('foo-bar.py') >>> baz 'quux' >>>
pkbketx93#
解决方案:如果无法重命名模块以匹配Python命名约定,请创建一个新模块作为中介:
新模块foo_proxy.py:
foo_proxy.py
tmp = __import__('foo-bar') globals().update(vars(tmp))
执行导入main.py的模块:
main.py
from foo_proxy import *
vs3odd8k4#
如果无法重命名原始文件,也可以使用符号链接:
ln -s foo-bar.py foo_bar.py
然后你可以做:
from foo_bar import *
mutmk8jj5#
正如其他人所说,在python命名中不能使用-一样,有很多解决方法,其中一种方法非常有用,如果你必须从一个路径添加多个模块,那就是使用m1n 1o1p例如,如果您的结构是这样的:
foo-bar ├── barfoo.py └── __init__.py
import sys sys.path.append('foo-bar') import barfoo
l5tcr1uw6#
这是我的场景:我有一个python库克隆在一个git子模块中,它的名称中有一个破折号:
|- 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,这将失败。这就是解决方案:
/home/user/bin/my-script.py
import importlib mylib_module = importlib.import_module("python-my-lib.mylib") MyClass = mylib_module.MyClass
如果您知道更简单的解决方案,请随时进一步改进此解决方案。
lbsnaicq7#
在Python 3.6中,当直接
import 'jaro-winkler' as jw
在使用时表示“No module named 'jaro-winkler'”:
No module named 'jaro-winkler'
jw = __import__('jaro-winkler')
importlib.import_module()相同。最后我使用pip卸载jaro-winkler模块…仅供参考
importlib.import_module()
jaro-winkler
ymdaylpp8#
Python有破折号-的问题。所以请改用importlib。您可以像这样运行测试脚本-
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-
test_someName.py
pytest
8条答案
按热度按时间u59ebvdq1#
从Python 3.1开始,您可以使用importlib:
(https://docs.python.org/3/library/importlib.html)
06odsfpq2#
在Python 2中,您不能。
foo-bar
不是标识符。将文件重命名为foo_bar.py
这是可能的,因为Python 3.1+,请参阅Julien's answer。
如果
import
不是你的目标(比如:你不在乎sys.modules
会发生什么,你不需要它来导入自己),只要把文件的所有全局变量都放到你自己的范围内,你就可以使用execfile
pkbketx93#
解决方案:如果无法重命名模块以匹配Python命名约定,请创建一个新模块作为中介:
新模块
foo_proxy.py
:执行导入
main.py
的模块:vs3odd8k4#
如果无法重命名原始文件,也可以使用符号链接:
然后你可以做:
mutmk8jj5#
正如其他人所说,在python命名中不能使用
-
一样,有很多解决方法,其中一种方法非常有用,如果你必须从一个路径添加多个模块,那就是使用m1n 1o1p例如,如果您的结构是这样的:
l5tcr1uw6#
这是我的场景:我有一个python库克隆在一个git子模块中,它的名称中有一个破折号:
我花了很长时间才弄明白:
附加路径不是一个选项,因为只有在同一目录中运行脚本时,它才会起作用。如果您执行
/home/user/bin/my-script.py
,这将失败。这就是解决方案:
如果您知道更简单的解决方案,请随时进一步改进此解决方案。
lbsnaicq7#
在Python 3.6中,当直接
在使用时表示“
No module named 'jaro-winkler'
”:importlib.import_module()
相同。最后我使用pip卸载
jaro-winkler
模块…仅供参考ymdaylpp8#
Python有破折号
-
的问题。所以请改用importlib
。您可以像这样运行测试脚本-将测试代码命名为
test_someName.py
-