モジュール名に「-」ダッシュまたはハイフンが含まれている場合にモジュールをインポートするにはどうすればよいですか?


193

foo-bar.pyをインポートします。これは機能します:

foobar = __import__("foo-bar")

これはしません:

from "foo-bar" import *

私の質問:上記の形式を使用する方法はありますか、つまり、from "foo-bar" import *を含むモジュールをインポートします-か?


10
名前にダッシュを含むモジュールがあるのはなぜですか?
Matti Virkkunen、2011

22
もともとはモジュールではなくスクリプトとして記述されていたと思います。
Michael Hoffman


win32comの@MattiVirkkunen makepy.pyは、ダッシュを含むモジュールを生成します。残念な。comtypesはアンダースコアに変換することでこれを解決しました
swdev 14

2
@MattiVirkkunen私はPythonがディレクトリに付けられる名前を制限すべきではないと思います。そうすることはその責任ではありません。
Zelphir Kaltstahl 2016

回答:


115

できません。 foo-barは識別子ではありません。ファイルの名前をfoo_bar.py

編集:importが目的ではない場合(例:で何が起こるかを気にせずsys.modules、それ自体をインポートする必要がない場合)、ファイルのすべてのグローバルを独自のスコープに取得するだけで使用できますexecfile

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

24
Python 3.x Python 3.0の新機能 execfile()を削除しました。代わりのexecfile(fn)使用exec(open(fn).read())も、パッケージのimportlibがあります。
DevPlayer 2015

103

Pythonの命名規則に一致するようにモジュールの名前を変更できない場合は、仲介として機能する新しいモジュールを作成します。

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

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

28
これを実装することはありません。しかし、私はこのハックの純粋な輝きに+1を与えることはできません
inspectorG4dget

11
あなたは実際にfoo_proxy.pyファイルなしでこれを行うことができ、の出力を__import__(...)toに割り当てますsys.modules['foo_proxy']。実際には、それをしないでください。それはひどい考えです。
SingleNegationElimination 2011

3
私が探していたものをクールに。ディストリビューションに同梱されているネイティブライブラリを使用する場合は、ユースケースがあります。
スヴェン


45

元のファイルの名前を変更できない場合は、シンボリックリンクを使用することもできます。

ln -s foo-bar.py foo_bar.py

その後、次のことができます:

from foo_bar import *

2

他の人が言ったように、Pythonの命名に "-"を使用することはできません、パスから複数のモジュールを追加する必要がある場合に役立つような多くの回避策があります。 sys.path

たとえば、次のような構造の場合:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

import barfoo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.