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


92

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

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


回答:


45

これらの空白は本当に気に:-(。試してみてくださいすることができos.chdir('C:/Documents\ and\ Settings/')ため、相対パスに続いてos.systemsubprocess方法、または何でも...

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


1
アレックス、ありがとう。これもうまくいきました。よろしければもう1つ質問があります。実行可能ファイルが入力ファイルの名前を要求する場合はどうでしょうか?私は標準入力を使用してそれをやろうとしましたが、これまでのところ成功できませんでしたか?
Mesut、

2
@mesut、ファイル名を「尋ねる」ために使用する実行可能ファイルは何ですか?たとえば、それが独自の標準入力である場合、subprocess.Popen目的の値をそこにパイプするために使用できる場合があります。さらに深くなった場合(「コンソール」入力を使用)、wexpect、sage.math.washington.edu / home / goreckc / sage / wexpectを試してください。
Alex Martelli、

入力ファイルは、同じフォルダー内の基本的な.txtファイルです。コードは現在、cmdウィンドウからexeを開きます。そして、実行可能ファイルは入力ファイルの名前を尋ねます。コード内でこの名前を(おそらくパスとして)定義する方法はありますか?私はsubprocess.popenを試し、変数を調べようとしました。stdinを使用できると思いましたが、うまくいきませんでした。あなたは私のCに位置して実行可能でsubprocess.popenでサンプル与えることができれば、私は本当に感謝:\ flow_model、flow.exeとsac_bsl.txtと同じフォルダに、入力ファイルの名前として実行可能ファイルの名前を
Mesut

「入力ファイル名をたずねる」部分が面倒です。既に述べたように、そのexeのコーディング方法について何も知らないことwexpectが、最も可能性の高い解決策です。これにより、そのexeファイルがcmdウィンドウで呼び出されたときに表示される内容を正確にシミュレーションできます。
Alex Martelli、

42

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


7
Python 3.6.3はrun()を
Ricardo Zorio 2017年

33

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

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

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


正常に動作していますが、-startなどのパラメーターを追加する方法はありますか?
Bassem Shahin、

1
動作しません:module 'os' has no attribute 'startfile'。(python3.6を使用)
not2qubit 2018年

どうやら、ドキュメントが与える印象に反して、Windowsに関連するものでは動作しません。
not2qubit 2018年

24

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

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

19

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

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


完全に機能しますが、結果をデータフレームに直接保存するにはどうすればよいですか?
サド

11

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

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

1
あなたはそれが意味を開始.exe速く?
Peter Mortensen


4

試す

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])

試してみたところ、同じことが起こりました。cmdウィンドウを開くようですが、実行可能ファイルは実行されません。実行ファイルを個別に試してみましたが、正常に動作しました。また、フォルダーをC:/ flow_modelとして移動しました。違いはありませんでした。
Mesut

2

私の場合は、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を使用しないので、コードは完全に正しくないかもしれませんが、考えを与えるべきです。エラーメッセージがエラーストリーム上にある可能性があります。


2
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")

1
コードがこの質問を解決する理由の説明を追加してください。
rje

この投稿は基本的に、実行中の* .exeファイルをWindowsの* .batファイルを使用する場合と同じように扱います。
SamAct

2

Python 2.6では、引用符 "とアポストロフィ 'マークで囲まれた文字列を使用します。また、シングル/をダブル//に変更します。作業例は次のようになります。

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)

1

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

また、あなたが考えるかもしれませんsubprocess.call()


0

これは正しい使用法ですが、おそらくパス名のスペースが何らかの理由で混乱しています。

エラーを示している可能性のあるflow.exeからの出力を確認できるように、cmd.exeでもプログラムを実行したい場合があります。


0

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

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

私はWindowsでのみ動作すると主張されているいくつかのことを発見したので、おそらく動作しません。おそらく、私がたまたまCygwinを使用しているためです。その他のものは、純粋な* nixベースのOSまたはPython2または3でのみ機能します。

これが私の発見です:

  • 一般的に言えば、os.system()最も寛容な方法です。
  • os.startfile()最も寛容ではありません。(Windowsのみ&&運が良ければ&&)
  • subprocess.Popen([...]) 推奨
  • 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:なぜ使いたいのですか explorer Windowsでですか?

A:新しいファイルの結果だけを見たい場合は、Explorerは、そのファイルタイプに設定したデフォルトのWindowsプログラムでファイルを自動的に開きます。したがって、使用するデフォルトのプログラムを再指定する必要はありません。


0

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

実行ファイルが置かれている場所へのパスを変更するだけです。

import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system("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ルートイメージは私のコード用です。


閉店を忘れ"ましたos.systemか?
Suraj Rao
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.