在Python CGI脚本中使用os.system()函数。
在Python CGI脚本中使用os.system()函数。
这个问题已经有了答案:
我正在使用Python在我的网站主机上构建一个CGI脚本,并使用wget进行测试。Shebang #!/home/me/virtualenv/public_html/chartex/3.6/bin/python3.6
指向正确版本的Python,以便在CGI中使用print(sys.version, sys.executable)
正确返回:
3.6.15 (default, Jan 14 2022, 12:16:54) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] /home/me/virtualenv/public_html/chartex/3.6/bin/python3.6_bin
此外,CGI中的print(os.path.abspath(\'.\'))
返回指向脚本所在位置的正确路径。
但是,如果我想要CGI报告系统中现有二进制文件的版本print(os.system(\'twopi -V\'))
仅返回0
。做print(os.system(\'ls\'))
的结果相同。
如果我在服务器上使用完整路径名调用在这个虚拟env中安装的相同Python,然后在命令行上调用print(os.system(\'twopi -V\'))
,它会正确地告诉我:twopi - graphviz version 4.0.0 (20220529.0937)
,然后在下一行:0
。同样,如果我执行print(os.system(\'ls\'))
这种系统命令对于cgi脚本是否不可能?有没有办法强制脚本报告此类系统命令的结果?
如果有任何人对subprocess
感到困惑,那么可以参考以下的解释:
在@furas的观察和大量的subprocess
实验之后,我终于找到了一种咒语,可以让我的Python2.7 CGI脚本给我展示twopi -V
命令的shell输出。在这个线程中,@tripleee的评论是关键。对于Python 3.7.9及以上版本,"capture_output
是选项组合stdout=supprocess.PIPE,stderr=subprocess.PIPE
的简写。
p = subprocess.Popen(['twopi', '-V'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) print("stderr: " + p.stderr.read()) print("stdout: " + p.stdout.read()) # with the result: stderr: twopi - graphviz version 4.0.0 (20220529.0937) stdout:
实际的shell输出是去stderr
了。 subprocess
模块非常复杂!虽然在Python3下有所改善,但还是不容易掌握。