web-dev-qa-db-ja.com

Pythonで外部プログラム(実行可能ファイル)を実行していますか?

私は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")

どうすれば修正できますか?

81
Mesut

これらの空白は本当に面倒です:-(。os.chdir('C:/Documents\ and\ Settings/')に続いてos.systemsubprocessメソッド、またはその他の相対パスを試します...

パス内の空白のハードルを回避しようとするベストエフォートが失敗し続ける場合、私の次の最善の提案は、avoid重要なパスに空白を含めることです。空白のないディレクトリを作成し、そこに重要な.exeファイルをコピーして、thatを試してみませんか?これらの破壊的なスペースはあなたの幸福にとって絶対に不可欠ですか?

39
Alex Martelli

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

41
Ida N

最も簡単な方法は次のとおりです。

import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")

できます;私はそれを試してみました。

22
Someone

私があなたなら、パスの前に 'r'を挿入して、それが生の文字列であることを示すようにします-そして、スラッシュを使用する必要はありません。例えば:

os.system(r"C:\Documents and Settings\flow_model\flow.exe")
21
Jon Mills

あなたの使用法は正しいです。外部プログラム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"')

(一重引用符内の二重引用符に注意してください...)

20
Adrien Plisson

subprocessを使用します。これは小さいモジュールなので、.exeをより速く実行します。

import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
9
Frodo Baggins

os.system を使用して:

import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
7
romy

試して

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
3
int3
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
1
John

私の場合は、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を使用していないので、コードは完全に正しいとは限りませんが、アイデアを与える必要があります。エラーメッセージがエラーストリームにある可能性があります。

1
extraneon

C:\Documentsの引数で"and", "Settings/flow_model/flow.exe"を実行しようとしていますか?

また、subprocess.call()を検討することもできます。

1
Thanatos

さまざまなソリューションが多数あり、結果は次の要素に大きく依存します。

  • 使用しているOS:Windows、Cygwin、Linux、MacOS
  • 使用しているpythonバージョン:Python2またはPython3x

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プログラムでファイルを自動的に開きます。そのため、使用するデフォルトのプログラムを再指定する必要はありません。

0
not2qubit

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)
0
Bomba Ps

上記の質問に対して、このソリューションは機能します。

実行可能ファイルがある場所へのパスを変更するだけです。

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は私のコード用です。

0
spurthi

これは正しい使い方ですが、パス名のスペースが何らかの理由で混乱している可能性があります。

Cmd.exeの下でプログラムを実行すると、エラーを示している可能性のあるflow.exeからの出力を確認できます。

0
Dan Olson