我尝试在 Windows 上使用 exec()
以这种方式从 PHP 运行 Python 脚本作为后台进程:
<?PHP
$python = 'C:\\Users\\User\\anaconda3\\python.exe';
$py_script = 'C:\\wamp\\www\\lab\\ex\\simple_test.py';
$py_stdout = '> temp\\'.session_id()."_std.txt";
$py_stderror = '2> temp\\'.session_id()."_stde.txt";
exec("$py_bg $python $py_script $py_stdout $py_stderror &");
脚本调用并正常工作,但 PHP 仍在等待脚本。
我删除了结尾 &
,因为我发现它只能在 Linux 上运行,并且在搜索其他问答后找到了这个选项:
exec("start /B $py_bg $python $py_script $py_stdout $py_stderror");
但同样的结果。我该如何解决这个问题?
=== 更新:
我以错误的方式使用了 start /B
,我将代码更改为:
<?PHP
$python = 'C:\\Users\\User\\anaconda3\\python.exe';
$py_script = 'C:\\wamp\\www\\lab\\ex\\simple_test.py';
$py_stdout = '> temp\\'.session_id()."_std.txt";
$py_stderror = '2> temp\\'.session_id()."_stde.txt";
$py_cmd = "$python $py_script $py_arg_1 $py_std $py_stde";
pclose(popen("start /B ". $py_cmd, "a"));
但现在 PHP 中的 popen()
警告:
警告:popen(start /B ...,a): C:\wamp\www\lab\start.php 第 50 行没有错误
和另一个pclose()
:
警告:pclose() 期望参数 1 是资源,布尔值在 ...
我检查了 PHP: popen - Manual 并看到 a
不是有效模式,但我在这里的几个答案中看到了这一点!
然而:
<块引用>模式。 'r' 表示读取,或 'w' 表示写入。
通过将模式更改为 r
,脚本在后台正确调用和运行,并且在 PHP 或 Py 上没有错误或警告。
<?PHP
$python = 'C:\\Users\\User\\anaconda3\\python.exe';
$py_script = 'C:\\wamp\\www\\lab\\ex\\simple_test.py';
$py_stdout = '> temp\\'.session_id()."_std.txt";
$py_stderror = '2> temp\\'.session_id()."_stde.txt";
$py_cmd = "$python $py_script $py_arg_1 $py_std $py_stde";
pclose(popen("start /B ". $py_cmd, "r"));