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

Posted

技术标签:

【中文标题】当模块名称中包含“-”破折号或连字符时如何导入模块?【英文标题】:How to import module when module name has a '-' dash or hyphen in it? 【发布时间】:2012-01-11 03:49:18 【问题描述】:

我想导入 foo-bar.py。这有效:

foobar = __import__("foo-bar")

这不是:

from "foo-bar" import *

我的问题:有什么方法可以使用上述格式,即from "foo-bar" import * 来导入其中包含- 的模块?

【问题讨论】:

为什么你的模块名称中带有破折号? 我猜它最初是作为脚本而不是作为模块编写的。 Python Module with a dash, or hyphen (-) in its name 的可能重复项 @MattiVirkkunen 我认为 Python 不应该限制我可以给我的目录的名称。这样做不是它的责任。 Is it ok to use dashes in Python files when trying to import them?的可能重复 【参考方案1】:

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

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

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

【讨论】:

我认为这是最好的解决方案,尤其是现在 Python 2 已正式弃用 这种方式如何重命名模块? @AliKhosro 它将被命名为您设置的任何变量。因此,如果您使用helloworld = importlib.import_module("foo-bar"),那么您将使用helloworld 引用foo-bar 中的字段,例如helloworld.abc【参考方案2】:

你不能。 foo-bar 不是标识符。将文件重命名为foo_bar.py

编辑:如果import 不是您的目标(例如:您不在乎sys.modules 会发生什么,您不需要它自己导入),只需获取所有文件的全局变量到你自己的范围,你可以使用execfile

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

【讨论】:

Python 3.x What’s New In Python 3.0 删除了 execfile()。而不是execfile(fn) 使用exec(open(fn).read()) 还有包importlib。 如果你不关心 sys.modules 会发生什么”,你能澄清一下你的意思吗?使用execfile的条件是什么?【参考方案3】:

如果您无法重命名模块以匹配 Python 命名约定,请创建一个新模块以充当中介:

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

 ---- main.py ----
 from foo_proxy import * 

【讨论】:

我永远不会实现这个。但我不能不为这个 hack 的出色表现 +1 您实际上可以在没有foo_proxy.py 文件的情况下执行此操作,将__import__(...) 的输出分配给sys.modules['foo_proxy']。实际上,不要那样做,这是一个糟糕的主意。 酷正是我想要的。如果使用发行版附带的本机库,则有一个用例。【参考方案4】:

如果您无法重命名原始文件,您也可以使用符号链接:

ln -s foo-bar.py foo_bar.py

那么你可以:

from foo_bar import *

【讨论】:

【参考方案5】:

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

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

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

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

import barfoo

【讨论】:

【参考方案6】:

在 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 模块...仅供参考

【讨论】:

以上是关于当模块名称中包含“-”破折号或连字符时如何导入模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用包含破折号的模块名称来限定命令?

如何在 Dojo AMD 中包含遗留模块

PySpark Sql 列名中包含破折号/连字符

Flutter 错误:VM 快照无效,无法从设置中推断。 - 当想要在 android 项目中包含 Flutter 模块时

文件夹中包含名称过长的项目,如何删除

你怎么知道你导入的模块是函数还是类?