Foo-bar.pyをインポートしたい。これは動作します:
foobar = __import__("foo-bar")
これはしません:
from "foo-bar" import *
私の質問:上記の形式、つまりfrom "foo-bar" import *
を使用して、-
を含むモジュールをインポートする方法はありますか?
できません。 foo-bar
は識別子ではありません。ファイルの名前をfoo_bar.py
に変更します
編集:import
が目標でない場合(たとえば、sys.modules
で何が起こるか気にしない場合、それをインポートする必要はありません)、取得するだけですファイルのすべてのグローバルを独自のスコープに追加するには、execfile
を使用できます
# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>>
Python命名規則に合わせてモジュールの名前を変更できない場合は、仲介として機能する新しいモジュールを作成します。
---- foo_proxy.py ----
tmp = __import__('foo-bar')
globals().update(vars(tmp))
---- main.py ----
from foo_proxy import *
元のファイルの名前を変更できない場合は、シンボリックリンクを使用することもできます。
ln -s foo-bar.py foo_bar.py
その後、あなたはちょうどすることができます:
from foo_bar import *
Python 3.1以降では、importlibを使用できます。
import importlib
foobar = importlib.import_module("foo-bar")
python命名で「-」を使用できないと他の人が言ったように、多くの回避策があります。パスから複数のモジュールを追加する必要がある場合に役立つ回避策の1つはsys.path
たとえば、構造が次のような場合:
foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')
import barfoo