6

Python スクリプトへのパスを含む文字列があり、そのスクリプトを透過的な方法で読み込んで実行したいとします (「python パス」を介して直接実行される場合と比較して内部スクリプトに根本的な違いがないように)。そして、結果のグローバル dict を取得します。runpy.run_path() がこれを行うと思いましたが、2 つの問題があります。パスに Unicode 文字が含まれている場合は機能しません ( http://bugs.python.org/issue17588を参照)。そして最も重要なことは、一時モジュールオブジェクトがガベージコレクションされると、この元の辞書は削除されるため、指定されたグローバル辞書は元の辞書の単なるコピーです。そのため、関数オブジェクトによって __globals__ dict が破損しています ( http://bugs.python.org/issue18331を参照)。

内部スクリプトを実行する方法はありますか?

更新:私の現在のアプローチを参照してください – http://bpaste.net/show/RzAbQxLNXiJsXYm2fplz/ . 助言がありますか?改善?たとえば、実行中のスクリプトの観点から何が異なるかの詳細についてです。__main__ の再読み込みに関する問題については知っています。

4

1 に答える 1

1

モジュールをインポートすると、最上位でコードが実行され、そのモジュールの「グローバル」名前空間がモジュールの名前としてインポートされます

james@bodacious:~$cat test.py
def func():
  pass

myname = "michael caine"

print "hello, %s" % myname
james@bodacious:~$python
Python 2.7.5 (default, Jul 12 2013, 18:42:21)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
hello, michael caine
>>> dir(test)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'func', 'myname']
>>>

実行したいコードがファイルの最上位にある場合は、モジュールをインポートするだけでコードが実行され、その「グローバル」名前空間にすべて 1 つの便利なパッケージアクセスできます。実行したいコードが最上位にない場合 (たとえば、main()一般的なトリックでのみトリガーされる関数内にある場合if __name__=="__main__")、その関数を自分で呼び出すことができます。

james@bodacious:~$cat test.py

def main():
    print "hello there!"

if __name__=="__main__":
    main()
james@bodacious:~$python
Python 2.7.5 (default, Jul 12 2013, 18:42:21)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.main()
hello there!
>>>

もちろん、インポートしたいファイルが sys.path にない可能性があるため、import. 単純な解決策は を操作することかもしれませんがsys.path完全なパスを指定してモジュールをインポートする方法は? を使用したより良いソリューションについて説明しますimp.load_source()

于 2013-07-31T22:29:33.913 に答える