Proc_open()c ++ / python

时间:2010-10-30 14:28:52

标签: php c++ python

我正在尝试使用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

但遗憾的是,它仍然因为同样的错误而失败:文件无法识别为内部或外部命令,程序或批处理文件。

一些额外信息:

我使用Wamp和PHP 5.3.0 我从proc_close() = 1

获得的返回值

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你误解了proc_open()的作用。它会打开一个类似于命令行的过程,例如: (在Unix中)diff file1.txt file2.txtproc_open()不会运行可执行文件。

根据页面,我认为您从http://php.net/manual/en/function.proc-open.php获取代码,以执行您将使用exec()的外部程序。您可以使用它(如果可执行文件位于正确的目录中):

<?php
echo exec('someprogram.exe');
?>

注意:我不确定这是否适用于Windows可执行文件。

这假设someprogram.exe是由您发布的C ++源代码编译的可执行文件。如果你想从PHP运行Python程序,首先使用Windows运气好,但你想使用proc_open()来调用python somescript.py,就像你从命令行那样。

答案 2 :(得分:0)

指定可执行文件的绝对路径:

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

我可以通过命令行调用下面的PHP脚本让PHP通过proc_open与Perl交谈:

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

$process = proc_open('/path/to/procopen.pl ' . $argv[1],
    $descriptorspec, $pipes);

if (is_resource($process)) {

  // print pipe output
  echo stream_get_contents($pipes[1]);

  // close pipe
  fclose($pipes[1]);

  // close process
  proc_close($process);
}

这是我的Perl脚本,它与上面的PHP脚本位于同一目录中:

#!/usr/bin/perl
print @ARGV;

但是在调用Python脚本时我无法运行PHP。命令行永远停止。这是为什么?