Pythonインタープリター内でファイルを実行する方法は?


289

インタープリター内からpythonコマンドでファイルを実行しようとしています。

編集:私は別のプロセスを呼び出すのではなく、そのファイルの変数と設定を使用しようとしています。


2
osモジュール、そして私は他の答えをチェックしています。
Adam Matan

2
推奨されるos.system; そして、私が編集を読んだときに答えを削除しました:-/
lightsong

回答:


229

いくつかの方法。

シェルから

python someFile.py

IDLE内からF5を押します。

インタラクティブに入力している場合は、これを試してください:(Python 2のみ!)

>>> variables= {}
>>> execfile( "someFile.py", variables )
>>> print variables # globals from the someFile module

Python3の場合、次を使用します。

>>> exec(open("filename.py").read())

10
pythonpython3代わりにpython 3を実行している場合は機能しません。
pzkpfw 2013年

41
execfileはpython3には存在せず、exec()はどういうわけか動作していないようです...何が間違っているのかわかりません。答えを更新できますか?
temporary_user_name

で実行中のスクリプトにstdin使用<するようなファイルから提供する方法はありexecfile()ますか?@ s-lott
bhanu

9
@pzkpfw pythonは、任意のバージョンのpythonを指すことができます。私が指すのはpython v3 だけの環境です。pythonpython3
StockB

2
@pzkpfwこれはpython、環境変数のフォルダを調べたときにシステムが検出する実行可能ファイルによって異なりますPATH
HelloGoodbye 2017

254

Python 2の場合:

>>> execfile('filename.py')

Python 3の場合:

>>> exec(open("filename.py").read())
# or
>>> from pathlib import Path
>>> exec(Path("filename.py").read_text())

ドキュメントを参照してください。Python 3.0を使用している場合は、この質問を参照してください。

実行後にfilename.pyからグローバルにアクセスする方法の例については、@ S.Lottによる回答を参照してください。


読み取りメソッドは何をしますか?残念ながら、公式ドキュメントサイトには明確な例と説明がありません。
ドミトリー

これはファイルを読み取り、コンテンツ全体を(デフォルトで)1つの文字列で返します。たとえば、ファイルopenのw3schoolsページを参照してください
最大

open()のドキュメントは次のとおり
codeape

96

Python 2 + Python 3

exec(open("./path/to/script.py").read(), globals())

これにより、スクリプトが実行され、すべてのグローバル変数がインタープリターのグローバルスコープに配置されます(ほとんどのスクリプト環境での通常の動作)。

Python 3のexecドキュメント


1
あなたは私のヒーローです!私は、os.getcwd()が1つのことを言っている数日間、本当に奇妙なものと戦っていますが、glob( "*")は別のディレクトリで動作しました...ありがとうございます!ありがとうございました!
パルヴィレセン

スクリプトにパラメーターを渡す方法はありますか?次は機能しません:exec(open "setup.py install")。read()、globals())
ベン

1
@ben openは、スクリプトからコードを直接読み取るため機能しません。引数を渡すには、この答えを見てください。ただし、代わりにexecfile、上記のようにexecopenを使用してください。
ニコ、

47

私はまだこれを見ていません。ファイルを実行し、-iオプションを使用して実行が終了した後、インタープリターを開いたままにすることができます。

| foo.py |
----------
testvar = 10

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18

30

別のプロセスを呼び出すのではなく、そのファイルの変数と設定を使用しようとしています。

まあ、単純にimport filename(マイナス.py、同じディレクトリまたはにある必要がありますPYTHONPATH)でファイルをインポートすると、ファイルが実行され、変数、関数、クラスなどがfilename.variable名前空間で使用できるようになります。

したがってcheddar.py、変数spamと関数eggsがある場合import cheddar、それらをでインポートし、で変数にアクセスして、次のcheddar.spam呼び出しで関数を実行できます。cheddar.eggs()

cheddar.py関数の外にあるコードがある場合は、すぐに実行されますが、インポート時に実行するアプリケーションをビルドすると、コードの再利用が難しくなります。可能であれば、すべてを関数またはクラス内に配置します。


4
質問が要求するように、それはグローバル名前空間を使用しません。代わりに使用from filename import *
Ricardo Cruz

この質問では、OPが必要とする可能性のあるグローバル名前空間の使用について具体的に言及していませんが、質問からは明らかではありません。
ryanpcmcquen 2017年

13

私の見解では、最善の方法は次のとおりです。

import yourfile

そしてyourfile.pyを変更した後

reload(yourfile)   

または

import imp; 
imp.reload(yourfile) in python3

しかし、これにより関数とクラスは次のようになります:yourfile.function1、yourfile.class1 .....

それらを受け入れることができない場合、最終的な解決策は次のとおりです。

reload(yourfile)
from yourfile import *

9

私は専門家ではありませんが、これは私が気づいたことです:

たとえば、コードがmycode.pyで、 'import mycode'と入力すると、Pythonはそれを実行しますが、すべての変数をインタープリターで使用できるようにはなりません。インタープリターですべての変数を使用できるようにする場合は、実際には「from mycode import *」と入力する必要があることがわかりました。


3
さらに、それは答えではなくコメントであるべきです。
Adam Matan 2015年

9

ただ、

from my_file import *

.py拡張子を追加しないようにしてください。サブディレクトリの.pyファイルが使用している場合、

from my_dir.my_file import *

それは私にとって最もエレガントなようです。
Massimiliano Kraus

8

python3の場合は、xxxx = nameofのいずれかを使用しますyourfile

exec(open('./xxxx.py').read())

8

Python 3の場合:

>>> exec(open("helloworld.py").read())

コマンドを実行する前に、正しいディレクトリにいることを確認してください。

別のディレクトリからファイルを実行するには、以下のコマンドを使用できます。

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
    exec(file.read())

1

次の機能が必要だとします。

  1. ソースファイルはデバッガーで正しく動作します(ファイル名はスタックに表示されます)
  2. __name__ == '__main__' はTrueなので、スクリプトはスクリプトとして正しく動作します。

exec(open('foo.py').read())機能1を失敗したimport foo戦略が機能2失敗します

両方を取得するには、次のものが必要です。

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.