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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

解決済

2回答

1260閲覧

【Python 2.7】別のPythonプログラムから変数の変更を行い、受け取る方法

Nanasisan_tera

総合スコア7

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

0クリップ

投稿2018/06/08 11:24

前提・実現したいこと

2つのPythonのプログラム(a.py, b.py)を実行したとき、bのクラスBの持つクラス変数をif name == 'main':の中で変更し、それをaのif name == 'main':の中で受け取る処理を行いたいと考えています。(もしくは、aのクラスAの持つクラス変数をbのif name == 'main':の中で変更し、a側に反映することを行いたいです。)

具体的には、以下のソースコードの例ですと、「a.pyを実行すると値が次第に増えていき、途中でb.pyを別端末から実行するとa.pyの値が一旦0に戻り、再び増加していく」という動作をさせようとしています。

背景として、現在ROSおよびGazeboを用いたロボットシミュレーションを行っており、センサ値から諸々を計算するプログラム内の値を、制御用のプログラム内から変更することを考えています。以下のソースコードaにおいてif name == 'main':内部で無限ループとしているのは、ROS用のプログラムの形に合わせたためです。

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

a.pyを実行後、b.pyを実行してもa.pyで計算している値に変化が見られません。(a側では何の影響も受けず、値が増え続けていきます。)

該当のソースコード

a.py

Python

1import b 2 3class A(): 4 x = 1.0 5 6 def __init__(self): 7 pass 8 9 def calc(self): 10 if(b.B.flag== True): 11 A.x=0.0 12 else: 13 A.x+=0.1 14 15if __name__ == '__main__': 16 a = A() 17 while(1): 18 a.calc() 19 print(a.x)

b.py

Python

1import a 2 3class B(): 4 flag = False 5 6 def __init__(self): 7 pass 8 9 def flag_true(self): 10 B.flag=True 11 12if __name__ == '__main__': 13 b=B() 14 #print(a.A.x) 15 b.flag_true() 16 #print(a.A.x) 17

試したこと

上記のコードの他にも、b内からa内の値を変更することであったり、3つ目のプログラムconfig.pyを作成すること(参考:http://iori084.blog.fc2.com/blog-entry-17.html)も試みましたが、結果は変わりませんでした。

初歩的なことで申し訳ありませんが、回答のほどよろしくお願いします。

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

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

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

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

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

guest

回答2

0

アプリケーションレベルでは、プロセスおよびプロセス間通信という概念が必要になります。
質問者さんは多分、コードでpy.aからpy.bを参照しているのでいいのではないかと誤解しているのでないかと思います。
質問者さんは一つのシェル(もしくはコマンドプロンプト)でa.pyを実行(これをプロセスAとします)し、その後、別のシェル(もしくはコマンドプロンプト)でb.pyを実行(これをプロセスBとします)していると思われます(順序は逆かもしれませんが)が、OS上、プロセスAとプロセスBは全く別物なのです。プロセスAはプロセスBのことを知りえませんし、その逆もしかりです。ですから、プロセス間通信をしなければプロセスAとプロセスBはそっぽを向いたままです。
プロセスAがプロセスBのことを知る(その逆も)ためにはプロセス間通信を行って知るしか方法がありません。
プロセス間通信をどのように行うかはネットにたくさん載っていますので勉強してください。

投稿2018/06/08 12:32

ikapy

総合スコア1167

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

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

Nanasisan_tera

2018/06/08 13:33

プロセス間通信に関しては初めて知りましたので、これからよく調べてみます。 ご回答ありがとうございました。
ikapy

2018/06/08 13:46

スレッドという概念もあります。これも勉強したらよいかと思います。
guest

0

ベストアンサー

実行プロセスが別になっている場合は変数も各プロセスごとに管理しているため、 a.py を実行しているプロセス内の変数を b.py の実行によって変更させることはできません。
2つのプロセスに共通の外部ファイルを用意して直接書き換えたり、あるいは外部のサービスと通信したり、プロセス間通信をするなどしないと無理です。

投稿2018/06/08 11:36

mather

総合スコア6753

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

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

Nanasisan_tera

2018/06/08 13:32

プロセス間通信に関しては初めて知りました。 まずは共通の外部ファイルを利用する方法を試してみて、ダメそうならプロセス間通信について調べてみようと思います。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問