3

データを読み取るネットワークプールとやり取りするPythonスクリプトがあります。これは、継続的に320ビットです。この 320 ビットは、Python スクリプトからこれらの 320 ビットを継続的に読み取り、int 配列に配置する C アプリに転送する必要があります[8]。正直なところ、これが可能かどうかはまったくわかりませんが、この問題の出発点に感謝します.

Python から C アプリに stdin 経由でデータを送信しようとして、あなたのアイデアのいくつかに協力しようとしました。

test.exe:

#include <stdio.h>
int main(void)
{
    int ch;
    /* read character by character from stdin */
    do {
    ch = fgetc(stdin);
    putchar(ch);
    } while (ch != EOF);


    return 0;
}

test.py:

def run(self):

    while True:           
        payload = 'some data'
        sys.stdout.write(payload)
        time.sleep(5)

次に、パイプを使用してこの全体を開始します。test.exe

残念ながら、test.exe 側で受信されるデータはありません。このデータは stdin で利用可能ではないでしょうか?

4

2 に答える 2

6

いくつかの可能な方法があります。

subprocessモジュールを使用して、PythonプログラムからCプログラムを開始できます。その場合、PythonプログラムからCプログラムの標準入力に書き込むことができます。これはおそらく最も簡単な方法です。

import subprocess

network_data = 'data from the network goes here'
p = subprocess.Popen(['the_C_program', 'optional', 'arguments'], 
                     stdin=subprocess.PIPE)
p.stdin.write(network_data)

注意:データを複数回送信する場合は、を使用しないPopen.communicate()でください。

または、 socketを使用することもできます。ただし、それを実行するには、両方のプログラムを変更する必要があります。

編集:コマンドラインでパイプを使用することについてのJF Sebatianのコメントは非常に真実です、私はそれを忘れました!ただし、覚えておく必要のあるコマンドが1つ少なく、特にPythonプログラムとCプログラム間で双方向通信が必要な場合(この場合stdout=subprocess.PIPEsubprocess.Popen呼び出しに追加する必要があり、Pythonプログラムで次のことができるため)、上記の手法は依然として役立ちます。から読むp.stdout)。

于 2012-10-25T17:08:39.967 に答える
3

Already mentioned:

  1. sockets (be careful about framing)
  2. message queues

New suggestions:

  1. ctypes (package up the C code as a shared object and call into it from python with ctypes)
  2. Cython/Pyrex (a Python-like language that allows you to pretty freely mix python and C data)
  3. SWIG (an interlanguage interfacing system)

In truth, sockets and message queues are probably a safer way to go. But they likely will also mean more code changes.

于 2012-10-25T18:59:26.677 に答える