2012-02-24 6 views
1

私はPython GUIインターフェースをTkinterで書いています。プログラムの主なポイントは、ハイパースペクトル画像(地形のもの)の最終的な計算にさまざまな変数を設定することです。さて、いくつかのさらなる仕様が開発され、ここで、ユーザは、平滑化される画素のグループに対していくつかのパラメータを能動的に入力することができるようになっている。この情報はPython GUIで入力され、画像の変更を処理するCプログラムはこれを入力として必要とします。画像は巨人することができますので、私は(巨大なファイルなどを読み込むメモリの割り当てを必要とする、)常に再実行するCプログラムを試してみて、避けたいな別々のCプログラムへの動的なpythonユーザー入力

os.system(./my_C_Program param1 param2 param3....) 

としてコールと私は好みます一度私がmy_C_Programと呼んだシステムを持つためには、すべてのリソースをメモリにロードした後に待機状態になる可能性があります。私はgetchar()を含む何かが私が望むだろうと思っていたが、私はmy_C_Programに行くためにどのように出力を得ることができるのか分からない。私はSOに関するこれに関するいくつかの同様の質問を見たことがありますが、これらのシナリオがどのように具体的にどのように役立つかを決定することはできませんでした。

答えがgetchar()の場合、複数の端末が開いている状態でstdoutがどのように動作するか説明してください。

また、私はこのプログラムをlinux/mac/windowsで簡単にマルチプラットフォームに保つよう努めています。

私は次の機能が欲しい、要約する:

  1. ユーザは、入力がCプログラムがなくても、複数の入力を処理できることをCプログラム
  2. の入力になるというPythonのGUI
  3. からの特定の入力を選択(ファイルI/Oなどを避けて)最初からやり直してください。
+1

Pythonプログラムに加えてCプログラムの設計と実装を制御できますか?あるいはその実装は石で設定されていますか? – sarnold

+0

私はCプログラムの設計/コードを完全に制御しています。異なる言語で異なるプログラムを接続するというこのアイデアは、私には全く新しいものです。 – Ponml

答えて

2

pexpectで何かできますか?コマンドラインプログラムに入力を提供し、指定されたプロンプトが表示されるのを待ってから続行します。また、介入する出力を読むことができるため、必要に応じて応答することができます。

あなたがWindows上にいる場合は(私があなたのコメントから書きました)、あなたはwinpexpectと似ています。

+0

私はこれを掘り下げながらこれを見ましたが、直接のWindowsサポートはないようです。おそらくそれは私が何を読んでから変わったのでしょうか?私は今それについてもっと理解しようとしています。 – Ponml

+0

[WExpect](https://bitbucket.org/geertj/winpexpect/wiki/Home)を試してください。私はあなたがWindows上にいたのか分からなかった。 – JasonFruit

+0

明らかに、その名前はwinpexpectに変更されています。 – JasonFruit

3

最初に行うべきことは、os.systemではなく、Python's subprocess moduleを使用することです。これをやったらCプログラムのstdinがPythonスクリプトのstdinを継承するのではなく、Pythonで書くことができるように変更することができます。

その後、PythonがCプログラムが解釈できるデータを送信することができます。たとえば、Twitter's streaming API のように、JSONチャンクを1行に1つずつ使用することができます。 Pythonスクリプトはリクエスト辞書を作成し、json.dumpでそれをシリアル化し、改行を書き込みます。 Cプログラムは行を読み込み、JSONを解析し、要求を処理します。

ドキュメントを読むと、実装が少し複雑になっているように見えます。あなたは彼らがそれをやる方法を採用することも、私が説明したようにそれを行うこともできます。

+0

私は今、サブプロセスを使っていくつかのことをしようとしています。私はCプログラムを実行するときにブロックするように見えます。たとえば、私のCプログラムが次のようなものだったとします。 'char x = getchar(); while(x!= 'q'){ \t x = getchar(); \t IF(X == 'A'){ \t \t MyMethodは()。 \t}} ' と私のPythonプログラムは次のとおりです。 ' P = sp.Popen( "./ my_C_Program") p.communicate(入力= 'A') ' とすぐコールとして''コミュニケーション 'が行われると、私のpythonはブロックされ続けます。 PythonをブロックせずにCプログラムを実行させる方法はありますか? – Ponml

+0

本当に編集して申し訳ありませんが、コードが正しくブロックされませんでした。 – Ponml

+0

@Ponml: 'stdin'を確実にリダイレクトして(' stdin = sp.PIPE'を 'Popen'に渡して) '通信する'と 'p.stdin.write(...) 'を使うと、ブロックしてはいけません。 – icktoofay

3

icktoofayおよびJasonFruitは、まともなアプローチを示唆している。 2つのプログラムをもう少し切り離すために何かを提案するつもりです。

あなたが要求をリッスンし、TCPソケットの答えを返信サーバーとしてCプログラムを記述する場合、あなたがより簡単に、クライアントを変更することが複数の同時クライアントをサポートします、クライアントのほぼシームレスなアップグレードを実行したりすることができますサーバーを変更しなくても、Cプログラムをより強力なハードウェアに移行させることができます。

あなたがリスニングソケットを開き、接続を受け入れた後は、あなただけの標準入力と標準出力を介して相互に作用しているかのように、あなたのプログラムの残りの部分は続けることができます。これで十分ですが、JSONASN.1などの標準化されたフォーマットでデータをエンコードする方が、手作業での文字列処理を省くことができます。

+1

+1ネットワーキングのアプローチにも行きます。長期的にはより簡単になり、脆弱にはなりません。 – Voo

+0

+1これは私より良い答えです。 – JasonFruit

関連する問題