私はPythonの作業を始めたばかりで、Pythonから外部の実行可能ファイルを実行しようとしています。
Fortranで書かれたプログラムの実行可能ファイルがあります。実行可能ファイルの名前がflow.exeだとします。そして、私の実行可能ファイルはC:\Documents and Settings\flow_model
にあります。 os.systemコマンドとpopenコマンドの両方を試しましたが、これまでは動作しませんでした。次のコードはコマンドウィンドウを開くように見えますが、モデルは実行されません。
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
どうすれば修正できますか?
これらの空白は本当に面倒です:-(。os.chdir('C:/Documents\ and\ Settings/')
に続いてos.system
、subprocess
メソッド、またはその他の相対パスを試します...
パス内の空白のハードルを回避しようとするベストエフォートが失敗し続ける場合、私の次の最善の提案は、avoid重要なパスに空白を含めることです。空白のないディレクトリを作成し、そこに重要な.exe
ファイルをコピーして、thatを試してみませんか?これらの破壊的なスペースはあなたの幸福にとって絶対に不可欠ですか?
Python 2.7以降(特にPython 3.5より前)を使用している場合、以下を使用できます。
import subprocess
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, Shell=False)
argsで記述されたコマンドを実行します。コマンドが完了するのを待ってから、returncode属性を返します。subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, Shell=False)
引数付きでコマンドを実行します。コマンドが完了するのを待ちます。戻りコードがゼロの場合は戻り、そうでない場合はCalledProcessErrorが発生します。 CalledProcessErrorオブジェクトのreturncode属性に戻りコードが含まれます例:subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
通常のPython文字列では、\ U文字の組み合わせは拡張Unicodeコードポイントエスケープを通知します。
ドキュメントへのリンクは次のとおりです。 http://docs.python.org/3.2/library/subprocess.html
Python 3.5+では、多くの場合run()を使用できます。 https://docs.python.org/3.5/library/subprocess.html#subprocess.run
最も簡単な方法は次のとおりです。
import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")
できます;私はそれを試してみました。
私があなたなら、パスの前に 'r'を挿入して、それが生の文字列であることを示すようにします-そして、スラッシュを使用する必要はありません。例えば:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
あなたの使用法は正しいです。外部プログラムflow.exeは、ディレクトリに格納されている外部ファイルにアクセスするため、そのディレクトリで実行する必要があります。
だからあなたは試すかもしれません:
import sys, string, os, arcgisscripting
os.chdir('c:\\documents and settings\\flow_model')
os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"')
(一重引用符内の二重引用符に注意してください...)
subprocessを使用します。これは小さいモジュールなので、.exe
をより速く実行します。
import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
os.system を使用して:
import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
試して
import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
私の場合は、EXEファイルをルートディレクトリ(C :)に配置し、そのように機能するかどうかを確認します。もしそうなら、それはおそらくディレクトリ名の(すでに言及した)スペースです。そうでない場合は、いくつかの環境変数である可能性があります。
また、stderrを確認してください(int3による以前の回答を使用)。
import subprocess
process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \
stderr = subprocess.PIPE)
if process.stderr:
print process.stderr.readlines()
私は通常PopenやWindowsを使用していないので、コードは完全に正しいとは限りませんが、アイデアを与える必要があります。エラーメッセージがエラーストリームにある可能性があります。
C:\Documents
の引数で"and", "Settings/flow_model/flow.exe"
を実行しようとしていますか?
また、subprocess.call()
を検討することもできます。
さまざまなソリューションが多数あり、結果は次の要素に大きく依存します。
Windowsでしか動作しないと主張されているものを発見したので、おそらく、Windowsパスを処理するためにOSの方法をしのぐCygwinを使用しているためでしょう。その他は、純粋な* nixベースのOSまたはPython2または3でのみ機能します。
私の発見は次のとおりです。
os.system()
は最も寛容な方法です。os.startfile()
は、最も寛容ではありません。 (Windowsのみ&&幸運なら)subprocess.Popen([...])
not推奨subprocess.run(winView, Shell=True)
推奨される方法!subprocess
を使用すると、セキュリティリスクが生じるになる可能性があることに注意してください。これらを試してください:
import os, subprocess
...
winView = '/cygdrive/c/Windows/Explorer.exe %s' % somefile
...
# chose one of these:
os.system(winView)
subprocess.Popen(['/cygdrive/c/Windows/Explorer.exe', 'somefile.png'])
subprocess.run(winView, Shell=True)
Q:WindowsでExplorer
を使用するのはなぜですか?
A:新しいファイルの結果だけを表示したい場合、Explorerはそのファイルタイプに設定したデフォルトのWindowsプログラムでファイルを自動的に開きます。そのため、使用するデフォルトのプログラムを再指定する必要はありません。
python 2.6では、引用符とアポストロフィ 'マークで囲まれた文字列を使用します。また、single /をdoubleに変更します。//作業例は次のようになります。
import os
os.system("'C://Documents and Settings//flow_model//flow.exe'")
また、プログラムがそれらを取り込む場合、任意のパラメーターを使用できます。
os.system('C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot -e "plot [-10:10] sin(x),atan(x),cos(atan(x)); pause mouse"')
最後に、Pythonから直接gnuplotを使用してプロットするように、文字列変数を使用できます。
this_program='C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot'
this_par='-e "set polar; plot [-2*pi:2*pi] [-3:3] [-3:3] t*sin(t); pause -1"'
os.system(this_program+" "+this_par)
上記の質問に対して、このソリューションは機能します。
実行可能ファイルがある場所へのパスを変更するだけです。
import sys, string, os
os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')
os.system(r"C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\flowwork.exe)
'''import sys, string, os
os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')
os.system(r"C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\pdftopng.exe test1.pdf rootimage")'''
ここでtest1.pdf rootimageは私のコード用です。
これは正しい使い方ですが、パス名のスペースが何らかの理由で混乱している可能性があります。
Cmd.exeの下でプログラムを実行すると、エラーを示している可能性のあるflow.exeからの出力を確認できます。