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

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

ただいまの
回答率

90.53%

  • Python

    7883questions

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

  • Python 3.x

    6292questions

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

  • PyCharm

    137questions

    エディター・開発ツール

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 309

furdral

score 2

 前提・実現したいこと

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

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

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

 該当のソースコード

import subprocess
import sys

try:
    result = subprocess.run('python','self.py', shell=True, check=True,
            stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    for line in result.stdout.splitlines():
        print('>>> ' + line)
except subprocess.CalledProcessError:
    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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/27 20:12

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

    キャンセル

  • 2018/05/27 20:18 編集

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

    キャンセル

  • 2018/05/27 20:19

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

    キャンセル

  • 2018/05/27 20:21

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

    キャンセル

  • 2018/05/27 20:23

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

    キャンセル

  • 2018/05/27 20:25

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

    キャンセル

  • 2018/05/27 20:29

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

    キャンセル

  • 2018/05/27 20:30

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

    キャンセル

  • 2018/05/27 20:43

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

    キャンセル

  • 2018/05/27 20:44

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

    キャンセル

  • 2018/05/27 20:45

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

    キャンセル

  • 2018/05/27 20:47

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

    キャンセル

  • 2018/05/27 20:49

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

    キャンセル

  • 2018/05/27 20:53 編集

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

    キャンセル

  • 2018/05/27 20:56 編集

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

    キャンセル

  • 2018/05/27 20:59 編集

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

    キャンセル

  • 2018/05/27 21: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

    キャンセル

  • 2018/05/27 21:00

    こうなります

    キャンセル

  • 2018/05/27 21:03

    とりあえずtest.pyは問題が起こるファイル名なので、変えましょうか(汗
    https://qiita.com/msmhrt/items/7e2a335a4c64bcc6e044

    キャンセル

  • 2018/05/27 21:04

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

    キャンセル

  • 2018/05/27 21:05

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

    キャンセル

  • 2018/05/27 21:06

    分かりました

    キャンセル

  • 2018/05/27 21:08

    追記で掲載しました

    キャンセル

  • 2018/05/27 21:11

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

    キャンセル

  • 2018/05/27 21: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.

    キャンセル

  • 2018/05/27 21:14

    こんな感じになりました

    キャンセル

  • 2018/05/27 21:18

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

    キャンセル

  • 2018/05/27 21:19

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

    キャンセル

  • 2018/05/27 21:21

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

    キャンセル

  • 2018/05/27 21:23

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

    キャンセル

  • 2018/05/27 21:27

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

    キャンセル

  • 2018/05/27 21:29

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

    キャンセル

  • 2018/05/27 21:30

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

    キャンセル

  • 2018/05/27 21:30

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

    キャンセル

  • 2018/05/27 21:31

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

    キャンセル

  • 2018/05/27 21:31

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

    キャンセル

  • 2018/05/27 21:34

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

    キャンセル

  • 2018/05/27 21:36 編集

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

    キャンセル

  • 2018/05/27 21:38

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

    キャンセル

  • 2018/05/27 21:38

    やってみます

    キャンセル

  • 2018/05/27 21:39

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

    キャンセル

  • 2018/05/27 21:41

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

    キャンセル

  • 2018/05/27 21:44

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

    キャンセル

  • 2018/05/27 21:45

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

    キャンセル

  • 2018/05/27 21:50 編集

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

    キャンセル

  • 2018/05/27 21:50

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

    キャンセル

  • 2018/05/27 21:53

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

    キャンセル

  • 2018/05/27 21:56

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

    キャンセル

  • 2018/05/27 21:58

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

    キャンセル

  • 2018/05/27 21:59

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

    キャンセル

  • 2018/05/27 22:01

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

    キャンセル

  • 2018/05/27 22:03

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

    キャンセル

  • 2018/05/27 22: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)
    これも走ると思うんですが

    キャンセル

  • 2018/05/27 22:12

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

    キャンセル

  • 2018/05/27 22:19

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

    キャンセル

  • 2018/05/27 22:20

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

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • Python

    7883questions

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

  • Python 3.x

    6292questions

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

  • PyCharm

    137questions

    エディター・開発ツール