2011-12-02 17 views
85

foo-bar.pyをインポートします。これは動作します:モジュール名にダッシュやハイフンがある場合、モジュールをインポートするにはどうすればいいですか?

foobar = __import__("foo-bar") 

これにはない:

from "foo-bar" import * 

私の質問:私はそれで-を持つモジュールをインポートする、すなわちfrom "foo-bar" import *を上記のフォーマットを使用することができますどのような方法がありますか?

+6

あなたはAとモジュールを持っていないのはなぜその名前にダッシュ? –

+11

私はそれがもともとモジュールではなくスクリプトとして書かれていたと推測しています。 –

+0

[Pythonモジュールのダッシュ、ハイフン( - )をその名前に含む]の重複可能性があります。(http://stackoverflow.com/questions/7583652/python-module-with-a-dash-or-hyphen-in-its -name) –

答えて

64

できません。 foo-barは識別子ではありません。 foo_bar.py

編集するファイルの名前を変更:import場合は、あなたの目標ではありません。ただ、ファイルのすべてを取得し、(のようにあなたがsys.modulesで何が起こるか気にしない、あなたはそれが自分自身をインポートする必要はありません)独自のスコープにグローバルあなたが仲介者として機能する新しいモジュールを作成し、Pythonの命名規則に一致するようにモジュールの名前を変更することができない場合は、あなたがexecfile

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

+1これは最も単純な修正です。 –

+10

Python 3.x [Python 3.0の新機能](https://docs.python.org/3/whatsnew/3.0.html)execfile()を削除しました。 'execfile(fn)'の代わりに 'exec(open(fn).read())'を使います。また、importlibというパッケージもあります。 – DevPlayer

64

を使用することができます:

元のファイルの名前を変更することができない場合、あなたはまた、シンボリックリンクを使用することができ
---- foo_proxy.py ---- 
tmp = __import__('foo-bar') 
globals().update(vars(tmp)) 

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

私はこれを決して実装しません。しかし、私は+1を与えることはできませんこのホックの光沢の完全な – inspectorG4dget

+5

'foo_proxy.py'ファイルなしでこれを実際に行うことができ、' __import __(...) 'の出力を' sys.modules [ foo_proxy '] 'を実行します。実際には、それをしないでください、それはひどい考えです。 – SingleNegationElimination

+2

私が探していたものを冷やす。ある配布物に同梱されているネイティブライブラリを使用する場合、ユースケースがあります。 – Sven

32

ln -s foo-bar.py foo_bar.py 

次に、あなたができるだけ:

from foo_bar import * 
+0

それは非常にハッキーですが、同時に非常にきちんとしています。 – user1767754

関連する問題