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

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

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

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

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

4585閲覧

並列処理で別のPythonスクリプトを実行し、Printされた文字をこちらに返す。

furdral

総合スコア8

Python 3.x

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

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2018/05/27 10:07

編集2018/05/27 12:46

前提・実現したいこと

並列処理で別のPythonスクリプトを実行し、Printされた文字をこちらに返す。

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

No such file or directory bufsize must be an integer の二つ(書き方を変えるとエラーが変化する。)

該当のソースコード

Python3

1import subprocess 2import sys 3 4try: 5 result = subprocess.run('python','self.py', shell=True, check=True, 6 stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) 7 for line in result.stdout.splitlines(): 8 print('>>> ' + line) 9except subprocess.CalledProcessError: 10 print('error', file=sys.stderr)

試したこと

フルパスでの指定

補足情報(FW/ツールのバージョンなど)

pycharm

###追記

import subprocess import sys result = subprocess.run(r'py C:\Users\a\Desktop\py3\self.py', shell=True, check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) for line in result.stdout.splitlines(): print('>>> ' + line)

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず、これでやってみてください。

python

1 result = subprocess.run('python self.py', shell=True, check=True, # result = の行を書き換え

複数の引数でコマンドを指定することはできないので、こうする必要があります。下のようにしても良いです。

python

1result = subprocess.run('python self.py'.split(), check=True, # この場合shell=Trueは外して良い 2# あるいは 3result = subprocess.run(['python', 'self.py'], check=True, # 上と同じことだが、リストにして与える

No such file or directoryが出たら、フルパスでの指定を試してください。もしwindows環境だと、パスに入る\がエスケープと解釈されるので注意。その場合は文字列の先頭にrを付けてr'path'とし、raw string扱いにして回避できます。

投稿2018/05/27 10:12

編集2018/05/27 11:04
hayataka2049

総合スコア30933

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

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

furdral

2018/05/27 11:12

回答ありがとうございます。 やってみた所エラーは回避できましたが、例外のprintの方が実行されてしまい実行したいスクリプトを実行できません・・・ どうすればよいでしょうか。
hayataka2049

2018/05/27 11:18 編集

質問文への追記で、どんな例外が出てるのか教えてください。スタックトレースまで載せていただけると助かります。self.py側で出ているようであれば、そちらも掲載してください
furdral

2018/05/27 11:19

一応except Exception as e: の方に変更してエラーを確認した所 Command 'py self.py' returned non-zero exit status 2. とのエラーが出ていました
hayataka2049

2018/05/27 11:21

なんでpyコマンドなんだろう・・・ python self.pyを直接ターミナルから実行すると、エラーは出ませんか?
furdral

2018/05/27 11:23

pythonだとpython2 pyでpython3で実行するようにしているので変更しました。 質問文の方はなぜかpyにするとそれはそれでエラーが出るのでpythonのままにしておきましたが・・・ 直接実行するとエラーは出ません。
furdral

2018/05/27 11:25

self.pyの方のスクリプトはLINE BOT関連の物で、実行後にログインするためのURLが発行されるので、それをこちら(別のスクリプト)で受け取る。 と言うことがしたいのですが・・・並列処理が良く分からないので上手くいかない状況です
hayataka2049

2018/05/27 11:29

「それはそれでエラーが出る」じゃなくて、self.pyはpyとpythonのどちらのコマンドで実行することを想定したプログラムなんですか? python2と3で構文も当然違うし、それぞれの環境にインストールされているライブラリも違うでしょうから、そのまま変えても動かないのは当然でしょうに
furdral

2018/05/27 11:30

どちらもpython3で pyコマンドで実行することを想定しています。 同じライブラリの中で動かす予定です。
hayataka2049

2018/05/27 11:43

そもそも怪しい並列処理なんかやめて、モジュールとして機能をまとめて関数呼び出しにでもすれば良いのでは? で、それはそれとして、returned non-zero exit status 2.の正体を突き止めたいですね・・・とりあえずフルパスにしても出ますか?
hayataka2049

2018/05/27 11:44

あと、py self.pyは当然そのまま実行できるんですよね(確認)
furdral

2018/05/27 11:45

そのまま実行できます。 フルパスにしたところ returned non-zero exit status 1. になりました…
furdral

2018/05/27 11:47

やりたい事としては、○○と言うと並列処理などでself.pyを実行し、printされたログインURLを受け取りこちらで表示する。(この時self.pyを実行したままで閉じずに。 なので並列処理かなと。) と言うことがやりたいのですが・・・
furdral

2018/05/27 11:49

subprocessにこだわるわけでもないので、他の方法でも可能ならそちらをお教え頂ければ・・・
hayataka2049

2018/05/27 11:57 編集

例外処理をすべて外して実行すると何が出るでしょうか。 追記: あるいは、 except subprocess.CalledProcessError as e: にしてe.outputをprintかなにかすると詳しく見れるかも
furdral

2018/05/27 11:56 編集

例外を外してしまうとどうしてもエラーになります。 SyntaxError: unexpected EOF while parsing
hayataka2049

2018/05/27 12:00 編集

スタックトレースをぜんぶ貼ってください
furdral

2018/05/27 12:00

C:\Users\a>py C:\Users\a\Desktop\py3\test.py File "C:\Users\a\Desktop\py3\test.py", line 9 ^ SyntaxError: unexpected EOF while parsing
furdral

2018/05/27 12:00

こうなります
furdral

2018/05/27 12:04

変えて実行してみましたが エラー変わらずです
hayataka2049

2018/05/27 12:05

変更後のプログラムを掲載してください。コメントではマークダウンが効かないので、質問への追記で
furdral

2018/05/27 12:06

分かりました
furdral

2018/05/27 12:08

追記で掲載しました
hayataka2049

2018/05/27 12:11

tryとexceptはセットなので、両方外す必要があります try: の行を消して、以下のインデントを1段階浅くしてください
furdral

2018/05/27 12:14

Traceback (most recent call last): File "C:\Users\a\Desktop\py3\heiretu.py", line 5, in <module> stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) File "C:\Python36\lib\subprocess.py", line 418, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command 'py C:\Users\a\Desktop\py3' returned non-zero exit status 1.
furdral

2018/05/27 12:14

こんな感じになりました
hayataka2049

2018/05/27 12:18

大した情報なかったですね・・・ ふと思ったけど、エラー情報はresult.stderrに入ってるんじゃないかしら。こっちをresult.stdoutと同様に見るとどうなります?
furdral

2018/05/27 12:19

同様に見るとはどういう?
hayataka2049

2018/05/27 12:21

check=Falseにして for line in result.stderr.splitlines():   print('>>> ' + line) とか追加してください
furdral

2018/05/27 12:23

やってみたところ 何も実行されず空白のまま一瞬で処理が終わってしまいました
hayataka2049

2018/05/27 12:27

stdoutにもstderrにも何も出てきませんか・・・謎 ところで、今気づいたけどr'py C:\Users\a\Desktop\py3'は正しいのですか?(ファイル名とか)
furdral

2018/05/27 12:29

間違ってないです。 py3フォルダの中にheiretu.pyがあるので
hayataka2049

2018/05/27 12:30

それならr'py C:\Users\a\Desktop\py3\heiretu.py'だと、どうなりますかね
hayataka2049

2018/05/27 12:30

ん、というかself.pyを実行したいのでは? heiretu.pyとか初めて聞きましたけど
furdral

2018/05/27 12:31

さっき名前変えたtest.pyですね。
furdral

2018/05/27 12:31

うーんと、もう1度やりたいことをまとめます
furdral

2018/05/27 12:34

今回のheiretu.pyで並列処理を使用しself.pyを実行、printされた文字(URL)を取得してheiretu.pyでprint。 self.pyはそのまま動かしたままで、heiretu.pyでその処理を実行する度にself.pyが一つずつ増えていく。 heiretu.pyのこの処理の実行にはinputなどで何かを入力したときに実行させるようにします。
furdral

2018/05/27 12:37 編集

inputなどは文字を取得→printで表示と言う過程が出来てから付けるので今はまだないです。
hayataka2049

2018/05/27 12:38

そしたら、とりあえずr'py self.pyのフルパス'にしないと動きませんね。ディレクトリまでの指定じゃなくて、ファイル名を含めて書いてくださいな。
furdral

2018/05/27 12:38

やってみます
hayataka2049

2018/05/27 12:39

「self.pyはそのまま動かしたままで」って書いてますけど、subprocess.runすると普通に処理が終了するとプロセス消えますけど・・・
furdral

2018/05/27 12:41

ええと、処理を実行する度にself.pyが一つずつ増えて動いたままにする方法はないでしょうか。 このheiretu.pyを停止した場合にのみ全部が停止するようにしたいので
furdral

2018/05/27 12:44

フルパスで指定した所、printがされなかったので文字を取得できてないみたいです。
furdral

2018/05/27 12:45

追記の方のソースを更新しておきます
hayataka2049

2018/05/27 12:50 編集

二重投稿になっちゃったから消した
hayataka2049

2018/05/27 12:50

>ええと、処理を実行する度にself.pyが一つずつ増えて動いたままにする方法はないでしょうか。 >このheiretu.pyを停止した場合にのみ全部が停止するようにしたいので runを使う限り、たぶん無理だと思います。subprocess. Popenの方だと確か動かしっぱなしにも出来た気がしますが、面倒くさいわリソース食うわで(たかがしれてるけど)あんまり良いことはありません threadingの方だと気楽にできますから、それ使うのは一つの選択肢でしょうね
hayataka2049

2018/05/27 12:53

そして今気づいた、stderr=subprocess.PIPEを消すとエラーがそのまま画面に出てくると・・・
furdral

2018/05/27 12:56

なるほど。 スクリプトはサーバーで動かすのでそのPopenでもいいのですが、threading?と言う方でやる場合はどの様にしたらいいですか?
hayataka2049

2018/05/27 12:58

とりあえず、今のimport以外のコードをぜんぶ消して(コメントアウトで良いです)、 subprocess.run(r'py C:\Users\a\Desktop\py3\self.py', shell=True) だけで実行してみましょうか。これでシェルから「py C:\Users\a\Desktop\py3\self.py」と打ったときと同じ出力にならなければ、もうこっちは諦めましょう
furdral

2018/05/27 12:59

同じ表示でURLが表示されました
hayataka2049

2018/05/27 13:01

関数としてまとめて走らせるだけです>threading?と言う方でやる場合はどの様にしたらいいですか? リソースのやり取りは工夫する必要がありますが、あとは走らせっぱなしにするのも(どんな処理が走るのかいまいち想像がつきませんが)割と自然に書けると思います ただしマルチコアの恩恵は受けられないのですが
furdral

2018/05/27 13:03

ふむ、ちょっと調べてみましたがthreadingの書き方が今一分からないので少しサンプルとして書いていただくことは可能ですかね?
hayataka2049

2018/05/27 13:08 編集

最近threading使う回答を書いたので、参考にしてください。あとはネットのとか見て頑張って>サンプル https://teratail.com/questions/128013 それよりURLが出た方が不可解なので、もうちょっとこっちを追求してみませんか。 2018/05/27 21:58のコメントのコードが動くなら、 result = subprocess.run(r'py C:\Users\a\Desktop\py3\self.py', shell=True, stdout=subprocess.PIPE, universal_newlines=True) print(result.stdout) これも走ると思うんですが
furdral

2018/05/27 13:12

実行後何も表示されずに処理も終わらないまま停止します。
hayataka2049

2018/05/27 13:19

そうですか。手元で適当なコード走らせた感じだと、普通に動くんですけどねぇ・・・。私はこれ以上は手も足も出なさそうです
furdral

2018/05/27 13:20

なるほど。 長々とありがとうございました。 また機会がありましたら宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問