2016-05-18 15 views
1

私のプログラムにファイルを渡し、そこから関数を取得したいと思います。モジュールのないソースファイルをロードする

は例えば、私は私のシステム上の任意の場所にすることができ、場所を実行時まで知られていないのですファイル、foo.pyを、持っているし、次のようになります。

def bar(): 
    return "foobar" 

は、どのように私は実行するために私のコードを取得することができます機能bar

場所が、私はこれを行うことができ、実行時前に知られていた場合:

import sys 
sys.path.append("path_to_foo") 
import foo 

foo.bar() 

私はfoo.pyであり、importlibまたはimpを使用しますが、それは厄介なようだフォルダ内のinit.pyファイルを作成することができます。 1あなたとの関数をオーバーライド、実行時に

def bar(): 
    pass 

実際:私はあなたがダミーの関数を記述し、チェックをバイパスするために、あなたが必要とするどこにでもそれを呼び出すことができますImportError: Import by filename is not supported.

+2

"私は[...]は' importlib' [...]を使うことができましたが、それは面倒です。 "あなたは面倒な問題があるときは、面倒なソリューションに頼らなければなりません。 importlibで十分ではないのはなぜですか? –

+0

また、 '__init __。py'ファイルはまったく必要ありません。 Py3では、より強力な 'importlib'関数は、任意のファイルをインポートする正しい方法です。以前のPythonでは 'foo.py'を含むフォルダを' sys.path'に追加して、特別なインポート関数を使わずに 'import foo'を実行するだけでした。 – ShadowRanger

+0

foo.pyはファイルと同じディレクトリにありますか? – NoOneIsHere

答えて

2

execを使用してファイルを開いて実行できます。

f = open('foo.py') 
source = f.read() 
exec(source) 
print bar() 

あなたもfoo.pyがあなたのメインファイルと同じディレクトリにある場合は、あなたが

from . import foo 

(Pythonの3)を使用することができますre

+0

私はこのようなものを使ってしまった。私は実際には 'sys.path.append(" path_to_foo "); file_name = foo.py; exec(fooとしてファイル名をインポート); foo.bar() ' –

+0

@ R.Mckemeyあなたは'誰が場所をランタイムまで知られていない、私のシステム上のどこにでも置くことができると言った。どのようにファイルを見つけるつもりですか? – NoOneIsHere

+0

申し訳ありませんが、わかりませんでした。ファイルパス全体がプログラムに渡されます。 'python program.py path_to_foo/foo.py'のようなものを実行します –

0

を得るように私は__import__を使用することはできません自動的にどこにでも使用される予定です。

注:これはimportlibを使用するよりも面倒です。

+0

私は「機能をオーバーライドする」方法を教えてください。 –

+0

@ R.Mckemey動的に関数コードの場所を把握すると、関数コードをロード/実行するために 'eval'または' exec'が使用できます。 – anand

0

を使用して、特定の機能のために見ることができます。これは、.があなたのファイルのディレクトリであり、Pythonが同じディレクトリにあるファイルをあなたのためにインポートするためです。あなたはそれがない場合は、あなたがそれを見つけ、それを実行する必要が

foo.bar() 

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

import os 
from os.path import join 

lookfor = "foo.py" 
for root, dirs, files in os.walk('C:\\'): # or '/' for Linux/OSX 
    if lookfor in files: 
     execfile(join(root, lookfor)) # Python 2, or 
     with open(join(root, lookfor)) as file: 
      exec(''.join(file.readlines())) 
     break 
foo.bar() 

クレジット:Martin Stoneを。私はコードをコピーするだけではなく、コードを理解していて、それを自分で作ったかもしれません。

関連する問題