Python调用PHP脚本失败:无响应或写入文件为空如何解决?
问题原因
你遇到的异常是多个错误叠加导致的,具体原因如下:
- 路径与参数格式错误
- 你写的PHP文件路径末尾多了不必要的空格(比如
'writetofile.php '、'~/hen-durance/writetofile.php '尾部的空格),会被识别为文件名的一部分,导致系统找不到对应PHP脚本,执行失败。 - 波浪号
~是shell专属的家目录展开语法,未开启shell=True时subprocess不会自动解析该符号,会把~当作普通路径字符处理,找不到对应文件。 - 第8种os.system写法拼接参数时缺少空格,实际执行的命令会变成
/usr/bin/php ~/hen-durance/writetofile.php{chosenWord},PHP无法识别到传入的$argv[1]参数,写入空值。
- 你写的PHP文件路径末尾多了不必要的空格(比如
- subprocess挂起原因
你调用subprocess时没有捕获stdout、stderr输出,当PHP脚本产生的输出填满缓冲区后,子进程会一直等待缓冲区被读取,进而导致主程序无限挂起。 - 写入路径不固定问题
你的PHP脚本中用相对路径GamesHistory.txt指定写入文件,写入位置由PHP进程的工作目录决定:你手动执行shell时工作目录是你预期的目录,而Python调用PHP时的工作目录是Python脚本的运行目录,会出现找不到写入路径、无写入权限的问题,最终生成空文件。
解决方案
按以下步骤修改即可解决问题:
- 优先修正PHP脚本的写入路径,避免相对路径导致的位置混乱:
<?php $word = $argv[1]; // __DIR__ 代表当前PHP脚本所在目录,确保写入位置固定 $file = fopen(__DIR__ . '/GamesHistory.txt', 'w'); fwrite($file, $word); fclose($file); ?>
- Python侧优先使用
subprocess.run执行调用,不要开启shell=True,手动展开家目录路径,同时捕获输出避免挂起,参考写法:
import subprocess import os # 手动展开家目录路径 php_script = os.path.expanduser("~/hen-durance/writetofile.php") # 执行调用,捕获输出,设置超时避免异常挂起 result = subprocess.run( ["php", php_script, chosenWord], capture_output=True, text=True, timeout=5 ) # 可选:异常时打印错误信息方便排查 if result.returncode != 0: print(f"调用PHP失败,错误信息:{result.stderr}")
- 若确认要使用
os.system,修正参数拼接的空格即可:
os.system(f'/usr/bin/php ~/hen-durance/writetofile.php {chosenWord}')
内容的提问来源于stack exchange,提问作者Fabio R.
相关产品推荐
相关产品推荐

