🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5581閲覧

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

YUMA-NAGAO

総合スコア41

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/12/19 03:01

編集2019/12/26 02:50

#環境
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

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

該当のソースコード

Python

1# import subprocess 2# 3place = 'cd C:/Users/Desktop/' 4value = 'test.exe ./test.txt' 5 6place=place.split() 7value=value.split() 8 9# 10# # proc = subprocess.run(place, shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 11# # print(proc.stdout.decode("cp932")) 12# # print(place) 13# # 14# # proc = subprocess.run(value, shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 15# # print(proc.stdout.decode("cp932")) 16# # print(value) 17# 18# try: 19# proc = subprocess.run(place, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 20# # print(proc.stdout.decode("cp932")) 21# proc2 = subprocess.run(value, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 22# # print(proc.stdout.decode("cp932")) 23# 24# except: 25# print('Error') 26 27 28import subprocess 29import sys 30import os 31# res1=os.system(place) 32res1=subprocess.call(place,shell=True) 33# res2=os.system(value) 34res2=subprocess.run(value,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 35print(res1,res2) 36sys.stdout.buffer.write(res2.stdout)

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

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

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

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

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

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

Python

1import subprocess 2place = r'C:\Users\Desktop' 3value = r'test.exe .\test.txt' 4 5subprocess.check_call(value.split(), cwd=place,shell=True) 6

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

python

1from subprocess import check_call 2 3check_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 04:06

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YUMA-NAGAO

2019/12/19 04:16

ご回答、ありがとうございます! ディレクトリは、指定しているのですが 「FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。」 というエラーが出てきて、うまく実行できていないです。 ドキュメントの読み方についても、言及していただきありがとうございます。 cwdがあるということがわかったのですが、うまく使いこなすことが出来ていなかったようです。 最初から最後まで一度読んでみます!
YouheiSakurai

2019/12/19 04:19

loopUBP.exeはその指定したディレクトリの中に存在していますか?
YUMA-NAGAO

2019/12/19 04:54

はい、存在しています。
YouheiSakurai

2019/12/19 05:22

じゃぁ申し訳ないのですがなぜ上手く動かないのかはわからないです。
YUMA-NAGAO

2019/12/19 05:53

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

2019/12/19 07: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)
guest

0

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

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

Python

1import subprocess 2import sys 3import os 4 5place = 'cd C:/Users/Desktop/' 6value = 'loopUBP.exe ./setValueAll.txt' 7 8res1=os.system(place+"&"+value) 9print("return code1 =",res1) 10 11res2=subprocess.run(place+"&"+value,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 12print("return code2 =",res2) 13sys.stdout.buffer.write(res2.stdout)

投稿2019/12/19 03:25

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YUMA-NAGAO

2019/12/19 03:56

ご回答、ありがとうございます! 所定通りの動作を実行することが出来ました!!! もう一つ質問です。 どのようにその回答を導いたかを教えていただきたいです。 ライブラリなどを参照して、わかったのでしょうか? それとも、cdコマンドの効果として、Linux界隈では常識とされていることなのでしょうか? ご回答いただけますと幸いです。
otn

2019/12/19 06:55

cdコマンドについては、Unix/Linux/Windows共通の基本です。 メソッド・関数の使い方については、リファレンスをよく見て、呼んでもわからないときはやってみて機能を確認しておくと言うことですかね。 リファレンスをよく読むと、YouheiSakuraiさんの回答のように、cd コマンドすら実行の必要がなくなります。 後、コマンド実行については、シェル(WindowsだとCMD.EXE)組み込みのコマンドなのか、独立した実行ファイルのコマンドなのかの意識も必要です。 シェル組み込みのコマンドの実行は、shell=True が必要ですし、その場合はコマンドを表す引数の渡し方も違ってきます。
YUMA-NAGAO

2019/12/19 07:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問