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

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

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

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

Q&A

解決済

2回答

1612閲覧

pythonの変数を別pythonプログラムに渡したい

knob

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2023/03/01 04:33

編集2023/03/01 05:48

起動してからの処理は速いけど起動するまでが長いpythonプログラムをAとします
処理したい実際の変数が登場するpythonプログラムをBとします
通常の場合、BにAをimportするなどして使用しますが、開発段階でBを何度も起動したり終了したりを繰り返す場合、Aの起動時間のせいでいちいちBの起動時間が遅くなって効率が悪くなります。
そこで、Aを常駐させておいて、Bが処理したい任意のタイミングでAにその変数を投げ、結果をBに返すなどできれば効率が上がると考えました。

調査したこと・試したこと

  1. threadingやmultiprocessingについて調べてみましたが、これらは1つのpythonプログラム上での並列処理についてのものだと解釈しました。同時に動いている必要のある2つのpythonプログラムの間でのデータのやり取りをしたいと考えているので、この方法では不可能だと解釈しました(間違っていたら教えてください)
  2. 実行中のプログラム間でのデータのやり取りすることは、localhost内でソケット通信することによって実現はできたのですが、これでは変数が2倍になってしまってちょっとリソースがもったいない気がします。(しかもタイムアウトしてしまいますし。。。)ちゃんと動いているときには、動作自体に問題はなかったので、他にいい方法がなければこの方法を使おうと考えています

実現したいこと
例えば、AをPID xxx で実行するように指定して、Bのプログラム内ではPID xxx に向けてデータを飛ばすと結果が返ってくるようなことはできますか?

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

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

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

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

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

bsdfan

2023/03/01 05:02

> 変数が2倍になってしまってちょっとリソースがもったいない気がします。 どれぐらいの大きさのデータをやりとりしたいのでしょうか?
knob

2023/03/01 05:28

データのサイズは2.7MBくらいです
knob

2023/03/01 05:55

>okukaさん >PythonのMultiprocessとかどうでしょうか。 こちらは、1つのpythonプログラム内でのマルチスレッドのように見えます。同じ方法を使って、複数の同時に実行されているpythonプログラム間でも値のやり取りはできるのでしょうか?pythonにあまり慣れていないので、これが幼稚な質問でしたら申し訳ありません
otn

2023/03/01 06:25

> データのサイズは2.7MBくらいです その程度であれば気にする必要ないのでは? > 例えば、AをPID xxx で実行するように指定して、Bのプログラム内ではPID xxx に向けてデータを飛ばすと結果が返ってくるようなことはできますか? できませんが、仮に出来ても、ソケット通信と比べてリソース面での優位性があるのでしょうか?
退会済みユーザー

退会済みユーザー

2023/03/01 08:01

普通のOSは一般にプロセス間で同じ(データ)メモリ空間をアクセスできないようにしているので、プロセスが分かれる以上一般には複製が必要になります。巨大なデータで複製を許容できない場合は、OSで用意されている共有メモリを使う形にするかと思います。 pythonでは共有メモリを使う場合、標準ではmultiprocessing.shared_memoryを使います。 https://docs.python.org/3.10/library/multiprocessing.shared_memory.html 他にもIPC(Inter-Process Communication)手段はforkベースのものからいろいろあると思いますし、ライブラリも豊富に揃っていると思います。またunixドメインソケットや名前付きパイプなどを使う手段は共有メモリと組み合わせても使えますよ。ただし、この手の機能はOSへの依存度が高いので、OSを明記することと、言語にはあまり依存しない話なので、OSの使いたい機能が分かるならそれを明記した方がいいですね。python以外の言語でしか説明できないなら、別の言語でも分かる人はそれなりにいると思いますよ。 あとソケットを使ったときにタイムアウトする意味が分かりません。
knob

2023/03/01 10:30

>dameoさん 丁寧な回答ありがとうございます なるほど、OSにも依存するために、普通は複製して使用する形を取っているんですね OSについては、基本的にはubuntuを使う予定ですが、windowsでも使う可能性があるためOS依存ならばできれば避けたいと感じました それから、ソケットがタイムアウトするのは自分の勘違いだったかもしれません。 他の方の意見も参考にした結果、ソケットを使う方向で行こうと考えました
guest

回答2

0

ベストアンサー

、AをPID xxx で実行するように指定して、Bのプログラム内ではPID xxx に向けてデータを飛ばすと結果が返ってくるようなことはできますか?

(Aを起動するときにPIDを指定することはできませんが、そのPIDと通信することは)できます。 まあ、質問にもあるように、ソケットを使ったり、キューやファイルなどいろいろな方法があります。
スレッド間であれば、メモリを共有することもできます。

これらは1つのpythonプログラム上での並列処理についてのものだと解釈しました。同時に動いている必要のある2つのpythonプログラムの間でのデータのやり取りをしたいと考えているので、この方法では不可能だと解釈

threadingもmultiprocessing も、複数のプロセスを「同時」に動かす仕組みなので、不可能という判断は間違えています。 ただし、pythonのスレッドは本当の意味で同時に複数は動きませんが、質問のようなシチュエーションではあまり関係ないと思います。
だだし、 「開発段階でBを何度も起動したり終了したりを繰り返す」というような使いかたの場合、AとBは独立したプロセスの方がやりやすいでしょう。

これでは変数が2倍になってしまってちょっとリソースがもったいない

メモリ上に存在する実際のデータを複数の処理で共有したいということのようですね。 であれば、theraedingしかありません。
ですが、threadingというのは、実体は1つのプロセスですから、やはり「 開発段階でBを何度も起動したり終了したりを繰り返す」というような方式には使えません。

ということで、回答は、

想定しているような使いかたの場合、Aの処理を常駐させておいて、ソケットなりキューなりパイプなりファイルなりのプロセス間通信方法を使って、Bのプロセスと通信させるのがいいでしょう。
この場合、変数と表現されているデータは共有できませんが、共有する方法はありません。

という感じでしょうか。

投稿2023/03/01 07:57

編集2023/03/01 13:02
TakaiY

総合スコア14249

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

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

knob

2023/03/01 10:25

ご回答頂きありがとうございます 複数の方からいろいろなアドバイスを頂いて、更にこの回答で、自分ではsocketを使うのが最適解だと判断できました pythonにはあまり慣れていないので、これから試行錯誤しながら自分のプログラムの実現を目指そうと思います
otn

2023/03/01 10:33

> > AをPID xxx で実行するように指定して > できます。 プロセスIDを指定してプロセスを生成することが出来るというのはどのOSでしょうか?
TakaiY

2023/03/01 13:01

> プロセスIDを指定してプロセスを生成することが出来る PIDを「指定」してプロセスを起動できるということだと捉えられてしまったのであればすみません。 そういうOSは僕も知りません。 意図としては、 PID XXX で起動されたプロセスに対して、そのPID XXXをキーにして通信をする方法はあるかということだとして回答しています。 (せっかくだから追記しておきます。)
otn

2023/03/02 07:01 編集

> ソケットを使ったり、キューやファイルなどいろいろな方法があります。 にしても、PIDに向けて通信するわけでは無いですね。ソケットだとポート番号かファイルパス、キューやファイルだとファイルパスを双方で同じ物を指定して通信する。 「PIDを使った通信は出来ませんが、実現する別の方法として~~~があります」と言うことだと思います。 (PIDを使った通信としてはシグナルがありますが、データを送れない)
guest

0

実行中のプログラム間でのデータのやり取りすることは、

プロセス間通信、でぐぐればいろいろでてくるかと

投稿2023/03/01 04:39

y_waiwai

総合スコア88163

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問