私のC++コードからpythonスクリプトを呼び出したいと思います。 Pythonスクリプトは次のようになります。C++は(bash、python ...)スクリプトを開始し、stdin/stdoutを使ってデータトランスファ[Linux]
hello.py
#!/usr/bin/python
import sys
print "Hello!"
Readin = sys.stdin.read()
print Readin
C++コードはスタックオーバーフローの他の質問です。どのように動作する必要がありますか:
パイプのペアを作成します。
fork()
で子プロセスを作成します。子はパイプをstdin/stdoutに曲げています。他の端を閉じて とスクリプトを開始する。
父系は、入力を受け取るパイプ
read()
で聞いています。その後、 メッセージを送信write()
。switch (readResult = read(childToPa...
が入力されたときに
プログラムは、父親ラインから戻りません。
また、この書き込み部分が仕事をしているかどうかもわかりません。このようなことをするのは有望なアイデアですか、それとも他の可能性がありますか? thx!
のように見えます:
// maybe not all includes are necessary
#include <iostream>
#include <fstream>
#include <string>
#include <errno.h>
#include <sys/stat.h> // mkdir
#include <stdlib.h> // system()
#include <unistd.h> // rmdir
#include <cstring> // memset
// wait:
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
int main() {
char target[] = "./hello.py";
enum PIPE_FILE_DESCRIPTERS {
READ_FD = 0, WRITE_FD = 1
};
enum CONSTANTS {
BUFFER_SIZE = 100
};
int parentToChild[2];
int childToParent[2];
pid_t pid;
string dataReadFromChild;
char buffer[BUFFER_SIZE + 1];
memset(buffer,0x00,BUFFER_SIZE + 1);
ssize_t readResult;
int status;
int retPipe1 = pipe(parentToChild);
int retPipe2 = pipe(childToParent);
switch (pid = fork()) {
case -1:
printf("Fork failed");
exit(-1);
case 0: /* Child will start scripts*/
{
// Bending stdin/out to the pipes?
int retdup21 = dup2(parentToChild[READ_FD], STDIN_FILENO);
int retdup22 = dup2(childToParent[WRITE_FD], STDOUT_FILENO);
int retdup23 = dup2(childToParent[WRITE_FD], STDERR_FILENO);
// Close in this Process the other sides of the pipe
int retclose1 = close(parentToChild[WRITE_FD]);
int retclose2 = close(childToParent[READ_FD]);
int retexe = execlp(target ," "); // warning not enough variable arguments to fit a sentinel [-Wformat=]
printf("This line should never be reached!!!"); // why? what happens if execlp finishes?
exit(-1);
break; // to make the compiler happy =)
}
default: /* Parent */
cout << "Child " << pid << " process running..." << endl;
// close the other ends of the pipe from the other process.
int retdup21 = close(parentToChild[READ_FD]);
int retdup22 = close(childToParent[WRITE_FD]);
// readtry
while (true) {
switch (readResult = read(childToParent[READ_FD], buffer, 1)) // execution does not return from this function.
{
case 0: /* End-of-File, or non-blocking read. */
{
cout << "End of file reached..." << endl << "Data received was (" << dataReadFromChild.size() << "):" << endl
<< dataReadFromChild << endl;
cout << "starting writing" << endl;
char bufferW[] = "{\"AElement\":\"Something\"}\0";
int writeResult = write(parentToChild[WRITE_FD],bufferW,sizeof(bufferW));
int saveerrno = errno;
if(-1 == writeResult)
{
cout << "errno while writing: " << errno << std::endl;
if (9 == saveerrno)
cout << "Errno Bad File descriptor" << endl;
}
cout << "Write Result: " << writeResult << std::endl;
int retWait = waitpid(pid, &status, 0);
cout << endl << "Child exit staus is: " << WEXITSTATUS(status) << endl << endl;
exit(0);
}
case -1:
{
if ((errno == EINTR) || (errno == EAGAIN)) {
errno = 0;
break;
} else {
printf("read() failed");
exit(-1);
}
}
default:
dataReadFromChild.append(buffer, readResult);
printf("%s",buffer);
memset(buffer,0x00,BUFFER_SIZE + 1);
break;
}
} /* while (true) */
} /* switch (pid = fork())*/
}
にその行を変更してください、どのようにそれはあなたが他のプログラム内のPythonコードを実行することを関連していますか?答え:そうではありません。したがって、コードや質問を簡単に減らし、最小限の例に近づけることができます。しかし、それでも私はあなたがそのアプローチのアイディアをどこから得たのだろうか?それは新しいものではなく、ユニークではなく、実際に確立されています。だから、既存の実用的な例を見つけるのは簡単なことです! –
@Ulrich EckhardtアセンブリにはC++コアがあります。これはジョブの入力を取得しています。コアはこの仕事を準備しており、データベースを更新しています。この後、仕事はpythonによって行われます。コアは将来も残るでしょう。しかし、今後の仕事の種類は変わります。そこで私たちはこれを行う簡単な方法を探しました。 APIを使用してスクリプトファイル名を入力 - > C++の準備 - > Pythonがやっている。これを成し遂げるには良い方法がありますか?私はプログラマーであり、このハックを使うのは好きではありません。これらのスクリプトは互いに呼び出すことができるべきであるため、stdin/put方法が提案されました。より良いアイデア? Thx =) –