18

.py実行時にファイルをロードしたいと思います。この.pyファイルは基本的に、次の形式の構成ファイルです。

var1=value  
var2=value  
predicate_function=func line : <return true or false>  

var1このファイルがロードされたら、 、var2およびにアクセスできるようにしたいと考えていますpredicate_function。行ごとに述語関数に渡し、false が返された場合は無視します。

いずれにせよ、実行時に Python ファイルをロードしてその変数にアクセスする方法がわかりません。

明確化: メイン プログラムに渡す必要があるこれらの構成ファイルはいくつでもある可能性があり、実行時までそれらの名前はわかりません。Google は、 を使用すべきだと言っています__import__。そのメソッドを正しく使用して、インポートされたファイルの変数にアクセスする方法がわかりません。

4

9 に答える 9

16

pythonの公式ドキュメントに書かれているように、名前だけでモジュールをインポートしたい場合は、sys.modules使用後に辞書で調べることができます__import__

構成が にあると仮定すると、次のmyproject.mymoduleようになります。

module_name = 'myproject.mymodule'

import sys
__import__(module_name)
mymodule = sys.modules[module_name]

# Then you can just access your variables and functions
print mymodule.var1
print mymodule.var2
# etc...

__import__statementの戻り値を使用することもできますが、python が名前空間とスコープでどのように機能するかを完全に理解する必要があります。

于 2010-02-14T09:47:18.307 に答える
10

インポートを動的に指定してから、変数を動的に取得できる必要があるだけです。

構成ファイルが bar.py で、次のようになっているとします。

x = 3
y = 4
def f(x): return (x<4)

次に、コードは次のようになります。

import sys

# somehow modnames should be a list of strings that are the names of config files
#
# you can do this more dynamically depending on what you're doing                                                                                                     
modnames = ['bar']

for modname in modnames:
  exec('import %s' % modname)

for modname in modnames:
  mod = sys.modules[modname]
  for k in mod.__dict__:
    if k[:2] != '__':
      print modname, k, mod.__dict__[k]

私はこの出力を得る:

bar f <function f at 0x7f2354eb4cf8>
bar x 3
bar y 4

次に、少なくともすべての変数と関数を取得します。述語関数からあなたが望むものを完全には得られませんでしたが、今は自分でそれを得ることができるかもしれません.

于 2010-02-14T09:24:21.910 に答える
7

別の Python モジュールにアクセスするには、それをインポートします。execfile数人が言及していますが、面倒で危険です。execfile名前空間が乱雑になり、実行中のコードが台無しになる可能性さえあります。別の Python ソース ファイルにアクセスする場合は、importステートメントを使用します。

さらに良いのは、構成に Python ファイルをまったく使用せず、組み込みモジュールConfigParserまたは JSON のようなシリアル化形式を使用することです。このようにして、構成ファイルは任意の (悪意のある可能性のある) コードの実行を許可せず、プログラムを構成するために Python の知識を必要とせず、プログラムで簡単に変更できます。

于 2010-02-14T00:00:42.863 に答える
7

インポートされたモジュールが通常の検索パスにある場合は、__import__.

ファイルシステムの任意のパスからモジュールをロードする必要がある場合は、imp.load_module.

任意のユーザー指定コードをロードすることによるセキュリティへの影響を必ず考慮してください。

于 2010-02-14T09:18:46.813 に答える
2

Python では2.*execfileが機能します (特定の辞書を渡し、そこから変数にアクセスすることをお勧めします。ドキュメントのメモにあるようexecfileに、呼び出し元の関数のlocals()辞書には影響しません)。

Python3.*では execfile が削除されたため、代わりに次のようにします。

with open('thefile.py') as f:
  exec(f.read(), somedict)
于 2010-02-13T23:05:31.890 に答える
1

プログラムが実行されていないときにのみユーザーによって編集される構成ファイルが必要な場合は、通常の python ファイルとしてインポートするだけです

すなわち。

main.py:

import config
print config.var1

config.py:

var="var12"
var2 = 100.5
于 2010-02-13T23:02:44.147 に答える
0

impモジュールを試してください:http://docs.python.org/library/imp.html

于 2011-02-04T23:29:56.007 に答える