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

Bal*_*ala 160 python import module hyphen

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

foobar = __import__("foo-bar")
Run Code Online (Sandbox Code Playgroud)

这不是:

from "foo-bar" import *
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*ion 110

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

编辑:如果import不是你的目标(如:你不在乎什么情况sys.modules,你不需要它导入自己),刚开所有文件的全局变量到你自己的范围,你可以使用execfile

# contents of foo-bar.py
baz = 'quux'
Run Code Online (Sandbox Code Playgroud)
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 
Run Code Online (Sandbox Code Playgroud)

  • Python 3.x [Python 3.0中的新功能](https://docs.python.org/3/whatsnew/3.0.html)删除了execfile().而不是`execfile(fn)`使用`exec(open(fn).read())`还有包importlib. (20认同)

Ray*_*ger 92

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

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

 ---- main.py ----
 from foo_proxy import * 
Run Code Online (Sandbox Code Playgroud)

  • 我永远不会实现这个.但我不能不给这个黑客的纯粹光彩+1 (22认同)
  • 你实际上可以在没有`foo_proxy.py`文件的情况下执行此操作,将`__import __(...)`的输出分配给`sys.modules ['foo_proxy']`.实际上,不要这样做,这是一个糟糕的主意. (10认同)
  • 很酷我正在寻找的东西.如果使用带有分发版的本机库,则有一个用例. (2认同)

Jul*_*ien 60

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

import importlib  
foobar = importlib.import_module("foo-bar")
Run Code Online (Sandbox Code Playgroud)

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

  • @AliKhosro 它将被命名为您设置的任何变量。因此,如果您使用 `helloworld = importlib.import_module("foo-bar")`,那么您将使用 `helloworld` 引用 foo-bar 中的字段,例如 `helloworld.abc` (3认同)

git*_*rik 45

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

ln -s foo-bar.py foo_bar.py
Run Code Online (Sandbox Code Playgroud)

然后你可以:

from foo_bar import *
Run Code Online (Sandbox Code Playgroud)

  • 上面的 *nix 命令可能不会,但 Windows_does_ 有自己的符号链接支持(自 Win7 起):`mklink Link Target` 参考:https://www.howtogeek.com/howto/16226/complete-guide-to-symbolic -windows 或 linux 上的链接符号链接/ (2认同)

Red*_*ssi 8

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

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

foo-bar
??? barfoo.py
??? __init__.py

Run Code Online (Sandbox Code Playgroud)
foo-bar
??? barfoo.py
??? __init__.py

Run Code Online (Sandbox Code Playgroud)