注意 - 以下の内容は回答として間違いです。質問の課題を解決できるものではありません。[2021/05/22 13:07追記]
(話の経緯を明確にするため、そのまま残しています。詳細は本回答コメント欄をご覧ください)
C言語で、次のプログラムのscanf()に、pythonのプログラムからデータを送りたいです。
Linuxのprocファイルシステムを使ってデータを送る例をご案内します。(Ubuntu16.04 64ビットで確認)
Linuxには、procファイルシステムがあり、各プロセスが開いているファイルディスクリプターを外部から扱うことができます。C言語で書かれたプログラムがscanf
で普通に入力待ちをしているとき、そのファイルディスクリプターは標準入力(STDIN
)の0
です。procファイルシステムではこれが仮想的なファイルになります。これへのリダイレクトで外部からのデータを当該プロセスへ流し込むことができます。
例えばプロセスID 123のプロセスであれば、その標準入力のファイルディスクリプターはprocファイルシステム下においてファイル名「/proc/123/fd/0
」となります。ちょっとばかり実演してみましょう。
※この例ではC言語側のソースファイルを、プロセスIDが分かり易いようにgetpid()
で得たプロセスIDを出力するよう、修正しています。
C
1#include <stdio.h>
2
3#include <sys/types.h>
4#include <unistd.h>
5
6void input()
7{
8 printf("pid=%u\n", getpid());
9 char input[100] = "";
10 printf("input\n");
11 scanf("%s", input);
12 printf("%s\n", input);
13}
14
15int main()
16{
17 input();
18 return 0;
19}
これを実行し、起動したままとします。本例ではプロセスID 3181です。
bash
1user01@ubuntu1604-x64:~$ gcc -Wall t1.c
2user01@ubuntu1604-x64:~$ ./a.out
3pid=3181
4input
これに対して、別の端末から標準入力(要はscanf
の入力)へデータを流し込んでみます。echo
コマンドのリダイレクトで充分です。
bash
1user01@ubuntu1604-x64:~$ echo "12345" > /proc/3181/fd/0
すると、scanf
で入力待ちしている方の端末で12345
が出力されることが確認できると思います。
更に今回はPython3スクリプトからと言うことなのでそれを利用してみます。ファイルのデータを使うので、本例ではdecode
します。
Python3
1user01@ubuntu1604-x64:~$ cat t1.py
2with open('datas1', 'rb') as f:
3 datas = f.read()
4with open('datas2', 'rb') as f:
5 datas2 = f.read()
6
7datas += datas2
8
9print(datas.decode(encoding='utf-8'))
このPython3スクリプトをt1.py として実行します。
bash
1user01@ubuntu1604-x64:~$ cat datas1
2text in datas1
3user01@ubuntu1604-x64:~$ cat datas2
4text in datas2
5user01@ubuntu1604-x64:~$ python3 t1.py
6text in datas1
7text in datas2
8
9user01@ubuntu1604-x64:~$
で、このPython3スクリプトの出力結果をecho
での例と同様に/proc/3181/fd/0/
にリダイレクトすれば、scanf
で入力待機している端末にやはり出力されます。
bash
1user01@ubuntu1604-x64:~$ python3 t1.py > /proc/3181/fd/0
一応この方法ならば、C言語側プログラムは普通に起動したままで外部からデータを流し込むことができます。お試しください。