web-dev-qa-db-ja.com

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

Foo-bar.pyをインポートしたい。これは動作します:

foobar = __import__("foo-bar")

これはしません:

from "foo-bar" import *

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

149
Bala

できません。 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 * 
87

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

ln -s foo-bar.py foo_bar.py

その後、あなたはちょうどすることができます:

from foo_bar import *
44
gitaarik

Python 3.1以降では、importlibを使用できます。

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

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

42
Julien

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

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

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

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

import barfoo
1
Reda Drissi