gpt4 book ai didi

php - Proc_open() c++/python

转载 作者:行者123 更新时间:2023-11-28 08:26:00 30 4
gpt4 key购买 nike

我正在尝试使用 proc_open(需要双向支持)调用 C++/Python 文件。

在做了一些在线研究后,我发现创建了这段代码:(我首先用 c++ 尝试,失败后我也尝试了 python)

PHP:

<?php
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "error-output.txt", "a")
);

$process = proc_open('new.exe', $descriptorspec, $pipes);

$input = 20;
$exp = 2;
if (is_resource($process)) {
print fgets($pipes[1]);
fwrite($pipes[0], $input);

print fgets($pipes[1]);
fwrite($pipes[0], $exp);

print fgets($pipes[1]);

fclose($pipes[1]);
fclose($pipes[0]);
$return_value = proc_close($process);

echo "command returned $return_value\n";
} else {
echo "No resource availeble";
}
?>

C++:

#include <iostream>
using namespace std;

int main () {
// Get variables from php
cout << "input" << endl;
cin << input
cout << "exponent" << endl;
cin << exp

// Process variables
int answer = input + exp;

// Return variables
cout << answer;

// End c++ script
return 0;
}

python :

print 'enter input'
inp = raw_input()

print 'enter exponent'
exp = raw_input()

ant = inp + exp

print ant

但遗憾的是,它一直失败并出现相同的错误:文件未被识别为内部或外部命令、程序或批处理文件。

一些额外的信息:

我在 PHP 5.3.0 中使用了 Wamp我从 proc_close() = 1

得到的返回值

最佳答案

您的代码中存在两个问题(至少对于运行 Python 脚本而言)。首先,您没有将 Python 输出刷新到它的 STDOUT,因此它永远不会到达 PHP。这会导致 fgetc() 无限阻塞。这是一个简单的修复,只需添加一些 flush() 调用:

#!/usr/bin/env python
import sys

print 'enter input'
sys.stdout.flush()
inp = raw_input()

print 'enter exponent'
sys.stdout.flush()
exp = raw_input()

ant = inp + exp

print ant
sys.stdout.flush()

然后,在您的 PHP 代码中,当您写入 Python 脚本 STDIN 时,您不会发送任何换行符。因此,Python 的 raw_input() 会无限期地等待换行符。同样,一个简单的修复。只需将 "\n" 添加到 fwrite() 调用中:

#!/usr/bin/php
<?php
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "error-output.txt", "a")
);

$process = proc_open('/path/to/python/script.py', $descriptorspec, $pipes);

$input = 20;
$exp = 2;
if (is_resource($process)) {
print fgets($pipes[1]);
fwrite($pipes[0], $input . "\n");

print fgets($pipes[1]);
fwrite($pipes[0], $exp . "\n");

print fgets($pipes[1]);

fclose($pipes[1]);
fclose($pipes[0]);
$return_value = proc_close($process);

echo "command returned $return_value\n";
} else {
echo "No resource availeble";
}

通过这些更改,我可以让您的代码按预期工作:

$ ./procopen.php 
enter input
enter exponent
202
command returned 0

关于php - Proc_open() c++/python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4059117/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com