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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Python

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

Q&A

解決済

2回答

10194閲覧

Popenでコマンドライン引数を渡したい

sky6720

総合スコア19

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/04/06 10:15

編集2020/04/13 03:16

pythonのsubprocessで同じディレクトリにある別ファイルを起動させています。
そのファイルはコマンドライン引数に応じて動作を変えているのですが、subprocess.Popenでのコマンドライン引数の渡し方がわかりません。

python

1 subprocess.Poen(['start', '', 'hogehoge.py']' shell=True)

初歩的な質問で申し訳ありませんがご教授ください。

##追記
ここ数日ご教授いただいたことを確認しましたが、正常動作しません。
参照先ではコマンドライン引数無しでも実行させたいのでtryで引数があるかを確認しています。
またhogehoge.pyでは受け取った引数は数値として扱いたいのでintにしています。
下記のように受け取ったあとtryexceptのどちらが動作しているか確認すると、
どちらにも入っておらず飛ばされていることが判明しました。
hogehoge.pyのせいでありそうだというところまで判明しました。

###再追記
下記が全ソースです。

「main.py」

python

1import tkinter as tk 2import subprocess as sp 3import k_msg 4 5def cptxt(event): 6 num = ent.get() 7 if not str.isdecimal(num): 8 k_msg.msg('error', 'input integer') 9 ent.delete(0, tk.END) 10 return 11 sp.Popen(['start', '', 'hogehoge.py', num], shell = True) 12 root.destroy() 13 14root = tk.Tk() 15ent = tk.Entry(root) 16ent.bind('<Return>', cptxt) 17ent.pack() 18root.mainloop()

「hogehoge.py」

python

1import tkinter as tk 2import pyperclip as pc 3import threading as th 4import sys 5import k_msg 6 7#ステータスのクリア 8def clear_status(i): 9 stts[i]['text'] = '' 10 11#コールバック関数_ステータスにコピーしたことを通知する 12def callback(i): 13 def copy_txt(event): 14 etr = etrs[i].get("1.0", "end-1c") 15 pc.copy(etr) 16 stts[i]['text'] = 'copy...' 17 t = th.Timer(1, clear_status, args=[i]) 18 t.start() 19 return copy_txt 20 21#コマンドラインオプションの値をテキストボックスの数にする_デフォルトは3 22if __name__ == '__main__': 23 try: 24 args = sys.argv 25 num_text = int(args[1]) 26 print('try') 27 except: 28 num_text = 3 29 print('except') 30 #枠の作成 31 print(num_text) 32 root = tk.Tk() 33 frame_field = '500x' + str(num_text * 100) 34 root.geometry(frame_field) 35 root.title('Copy Text V1.0') 36 #各ボタン・テキストボックスの作成 37 etrs = [] 38 butts = [] 39 stts = [] 40 for i in range(num_text): 41 etrs.append(tk.Text(root, width='40', height='3', font='consolas')) 42 etrs[i].place(x='10', y=100*i+10) 43 butts.append(tk.Button(root, text='Copy', width='7', height='1', font='consolas')) 44 butts[i].bind('<Enter>', callback(i)) 45 butts[i].place(x='415', y=100*i+10) 46 stts.append(tk.Label(root, text='', width='10', height='1', font=('consolas', 10))) 47 stts[i].place(x='415', y=100*i+50) 48 49 root.mainloop()

「k_msg.py」

python

1def msg(ttl, val, box=64): 2 """ 3 show messagebox 4 5 args: 6 [0] : title 7 [1] : value 8 [2] : form type 9 10 form type(return value): 11 0 : OK(1) 12 1 : OK(1) キャンセル(2) 13 2 : 中止(3) 再試行(4) 無視(5) 14 3 : はい(6) いいえ(7) キャンセル(2) 15 4 : はい(6) いいえ(7) 16 5 : 再試行(4) キャンセル(2) 17 6 : キャンセル(2) 再実行(10) 続行(11) 18 +16 : Exclamation 19 +32 : Question 20 +48 : Warning 21 +64 : Information 22 """ 23 import ctypes as ct 24 u32 = ct.WinDLL('user32') 25 return u32.MessageBoxW(0, val, ttl, box+65536)

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

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

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

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

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

bsdfan

2020/04/13 02:06

hogehoge.pyに import sys がないですが、転記で抜けただけですか? import sysが入っていたとしても、このスクリプトでは、 実行したときに新しいウィンドウができて、そのウィンドウにprintしてすぐ閉じられるので、 確認は難しいと思うのですが。
bsdfan

2020/04/13 04:12

スクリプトの追加ありがとうございます。 try も except も表示されないのは、もしかしたらバッファリングの関係かもしれないです。 set PYTHONUNBUFFERED=1 してからpythonを実行してみたら表示されないでしょうか。 あとは、exceptのところで発生したexceptionを表示するようにしたら、何が起こっているか明確になると思います。
sky6720

2020/04/13 05:41

ご回答ありがとうございます。 参照先のhogehoge.pyでのprint文が無視されているようなのですが、これは仕様なのでしょうか。 実行環境はSpyder3.3.4です。
bsdfan

2020/04/13 06:35

print文が無視されているのではなくて、バッファリングと言って、表示すべき内容(文字数)がある程度たまってからまとめて表示する機能のために、画面に出ていないだけではないかと思いました。 PYTHONUNBUFFERED の環境変数でバッファリングを無効にして試していただきたかったのですが、Spyderは使ったことがないので、どうやって環境変数をセットできるのか知りません。 もう少しいい方法があるかもしれませんが、標準エラーに出力するとバッファリングされないはずなので、 print('try', file=sys.stderr) にしたら画面に表示されると思います。
sky6720

2020/04/14 00:08

print('try', file=sys.stderr) で出力してもなにも表示されませんでした。。。
bsdfan

2020/04/14 01:27

新しいウィンドウが開いて、そこに表示されていませんか? Spyderだと違うのかもしれませんが、そうなるとわかりません。
sky6720

2020/04/14 03:00

一度コマンドプロンプトから起動もしてみましたが、 別ウィンドウも表示されておりませんでした…。
bsdfan

2020/04/14 04:13

.pyへの関連付けが、私の環境と違っているため、違う動きになっていそうです。 (単に差があるだけで、どちらが間違いというわけではないです)
guest

回答2

0

ベストアンサー

明示的に、実行するコマンドを書いたほうがよいです。

python

1sp.Popen(['start', 'python.exe', 'hogehoge.py', num], shell=True)

python.exeがPATHにない場合は絶対パス('C:\python\python.exe'など自分の環境にあわせて)で渡してください。

'start'をなくせば、子プロセスの出力先が親プロセスと同じになります。

python

1sp.Popen(['python.exe', 'hogehoge.py', num])

(waitしたほうがいいかもしれませんが省略)

投稿2020/04/14 04:14

bsdfan

総合スコア4794

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

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

sky6720

2020/04/14 06:16

うまくいきました! 根気よくご教授いただきありがとうございました。
guest

0

引数の指定が分からないということは、そもそもそのコードの意味が理解できていないということでは?

Python

1subprocess.Popen(['start', 'hogehoge.py', '引数1', '引数2'], shell=True)

#追記
自分のプログラムと見比べてください。
「prog1.py」

Python

1import subprocess 2subprocess.Popen(['start', 'prog2.py', 'argument-1', 'argument-2'], shell=True)

「prog2.py」

Python

1import sys 2print(sys.argv) 3input()

投稿2020/04/06 10:49

編集2020/04/07 10:29
otn

総合スコア85901

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

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

sky6720

2020/04/06 23:40

ご回答ありがとうございます。 この引数はコマンドライン引数と同じなのでしょうか。 hogehoge.pyは`sys.argv[0]`のようにコマンドライン引数を取得するような コードにしております。 このときの引数をPopenにて渡したい次第です。
otn

2020/04/07 01:51

質問に対しての回答に対して、質問と同じことを再度聞くというのは、何か意味がありますか?
sky6720

2020/04/07 02:04

失礼しました。 いただいた回答では意図した動作にならなかったため再度お聞きした次第です。 引数がなかった場合のhogehoge.pyの動作となりました。
otn

2020/04/07 02:14

失礼した。タイプミスがあったので、修正しました。Poen → Popen > 引数がなかった場合のhogehoge.pyの動作となりました。 は、コードがおかしいか、設定がおかしいか。 コマンドプロンプトで、 hogehoge.py 引数1 引数2 と打って引数が渡らないのなら、設定がおかしいです。
sky6720

2020/04/07 08:35

コマンドプロンプトでの実行はうまく動作しました。 sys.argv[1]で受け取った引数を表示させるようにhogehoge.pyを変更したところ、 空が返ってきたので何も渡っていないのだと思います。
sky6720

2020/04/14 06:17

otn様にも根気よくご教授いただきましてありがとうございました。 おかげさまでうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問