質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

Pythonでディレクトリを指定して、exeを起動したい【自動化】(subprocess)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 291

YUMA-NAGAO

score 10

環境

Windows10
python3.7

前提・実現したいこと

windowsのコマンドプロンプトで実現していることをPython上で実行し、
自動化につなげたい。

試したこと

osモジュールを使い、subprocessと同じことが出来ると聞いたので、osでも同じ動作をするようにコードを組んだが、思った通りの結果を得ることが出来ない。

下記の参考リンクをもとに自分でコードを組んでみたが、実装することが出来ないです。

python  import subprocess CDで移動できない
Calling an external command from Python
subprocess — Subprocess management
【Python入門】subprocessを使ってコマンドを実行しよう!
初心者でも簡単!PythonでWindowsのアプリケーションを起動する方法
Pythonからコマンドを呼び出す(Windows編)
Pythonでexeテスト実行
Python から外部プログラムを起動する (subprocess.run)
Pythonで特定のファイルをアプリケーションで開く方法とフォルダを開く方法
Pythonによる外部プログラム、プロセス、アプリの起動実行方法
【Python】subprocess の run や Popen で実行時のフォルダを指定する方法 ⇒ 引数 cwd を使う
subprocessを使って外部プログラムを実行する
Pythonから外部プログラムを起動
Pythonで特定のファイルをアプリケーションで開く方法とフォルダを開く方法
Pythonによる外部プログラム、プロセス、アプリの起動実行方法

発生している問題・エラーメッセージ

エラーメッセージ文字化けしていて読めないです。

�t�@�C�����A�f�B���N�g�����A�܂��̓{�����[�� ���x���̍\�����Ԉ���Ă��܂��B

コマンドプロンプトでの実行結果

C:\Users\Desktop\>loopUBP.exe .\setValueAll.txt
not Continue


この状態で、指定の動作がパソコンで実行されます。

該当のソースコード

# import subprocess
#
place = 'cd C:/Users/Desktop/'
value = 'test.exe ./test.txt'

place=place.split()
value=value.split()

#
# # proc = subprocess.run(place, shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
# # print(proc.stdout.decode("cp932"))
# # print(place)
# #
# # proc = subprocess.run(value, shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
# # print(proc.stdout.decode("cp932"))
# # print(value)
#
# try:
#     proc = subprocess.run(place, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#     # print(proc.stdout.decode("cp932"))
#     proc2 = subprocess.run(value, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#     # print(proc.stdout.decode("cp932"))
#
# except:
#     print('Error')


import subprocess
import sys
import os
# res1=os.system(place)
res1=subprocess.call(place,shell=True)
# res2=os.system(value)
res2=subprocess.run(value,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(res1,res2)
sys.stdout.buffer.write(res2.stdout)

教えていただきたいこと

どのように、コードを変えればいのか?
また、どうやって解決方法を導き出したか教えていただきたいです。

あと、公式ドキュメントをうまく読むコツがありましたら、教えていただきたいです。

自力で解決できるようになりたいので!

よろしくお願いいたします。

至らない点もあると思いますが、よろしくお願いいたします。

回答(追記)

お二方の回答をまとめて、一番短くした回答です。
ドキュメントを読むと、すさまじく短くできることがわかりました。
本当に感謝します。

下記のようにまとめることが出来ます。

import subprocess
place = r'C:\Users\Desktop'
value = r'test.exe .\test.txt'

subprocess.check_call(value.split(), cwd=place,shell=True)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

やりたいことは以下で実現できます。

from subprocess import check_call

check_call(r"loopUBP.exe .\setValueAll.txt".split(), cwd=r"C:\Users\Desktop")

ポイントは以下の通りです。

  1. \は文字列の中ではエスケープの意味を持ってしまうのでr"~"というようにrをつける。
  2. コマンドは.split()で分割しています。が、["loopUBP.exe", "setValueAll.txt"]と書くほうが無難かもしれません。
  3. 引数cwdで実行ディレクトリを指定しています。

ドキュメントを読むコツは、他のブログ情報などは当てにせずに、ますはちゃんと時間をかけて上から下まで、英語も読み飛ばさずにしっかり全部読んで内容を理解できなくても理解しようと努力することです。cwd引数に関してもsubprocess --- サブプロセス管理のページ5分の3くらいのところに記述が見つかります。ドキュメントを読んだら次にブログ等を補足情報として読むと良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/19 14:53

    承知しました。
    教えていただき、ありがとうございました!

    キャンセル

  • 2019/12/19 16:22

    うまく解決できました
    引数にshell=Trueと入れることで、実行することが出来ました!

    コードにすると、下記のようになります!
    import subprocess
    place = r'C:\Users\Desktop'
    value = r'loopUBP.exe .\setValueAll.txt'

    subprocess.check_call(value.split(), cwd=place,shell=True)

    キャンセル

  • 2019/12/19 16:28

    解決できて何よりです。

    キャンセル

+1

こんな感じでしょうか。
cdコマンドの効果は、そのプロセス内のみなので、同じプロセスで両コマンドを実行する必要があります。

コマンドを&で区切るのはWindowsのCMD.EXEの場合です。
Linuxで;、Windowsで& を返すような定数があれば良いのですが、osには見つかりませんでした。

import subprocess
import sys
import os

place = 'cd C:/Users/Desktop/'
value = 'loopUBP.exe ./setValueAll.txt'

res1=os.system(place+"&"+value)
print("return code1 =",res1)

res2=subprocess.run(place+"&"+value,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print("return code2 =",res2)
sys.stdout.buffer.write(res2.stdout)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/19 12:56

    ご回答、ありがとうございます!
    所定通りの動作を実行することが出来ました!!!

    もう一つ質問です。
    どのようにその回答を導いたかを教えていただきたいです。
    ライブラリなどを参照して、わかったのでしょうか?

    それとも、cdコマンドの効果として、Linux界隈では常識とされていることなのでしょうか?
    ご回答いただけますと幸いです。

    キャンセル

  • 2019/12/19 15:55

    cdコマンドについては、Unix/Linux/Windows共通の基本です。

    メソッド・関数の使い方については、リファレンスをよく見て、呼んでもわからないときはやってみて機能を確認しておくと言うことですかね。
    リファレンスをよく読むと、YouheiSakuraiさんの回答のように、cd コマンドすら実行の必要がなくなります。

    後、コマンド実行については、シェル(WindowsだとCMD.EXE)組み込みのコマンドなのか、独立した実行ファイルのコマンドなのかの意識も必要です。
    シェル組み込みのコマンドの実行は、shell=True が必要ですし、その場合はコマンドを表す引数の渡し方も違ってきます。

    キャンセル

  • 2019/12/19 16:26

    お二方ともわかりやすかったので、両方ベストアンサーをつけたいところです。
    ですが、それは出来ないので、後に他の人が見てわかりやすいと思われる
    YouheiSakuraiさんにベストアンサーをつけたいと思います。

    ご回答いただき、ありがとうございました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる