在Python CGI脚本中使用os.system()函数。

18 浏览
0 Comments

在Python CGI脚本中使用os.system()函数。

这个问题已经有了答案

如何从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脚本是否不可能?有没有办法强制脚本报告此类系统命令的结果?

admin 更改状态以发布 2023年5月22日
0
0 Comments

如果有任何人对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下有所改善,但还是不容易掌握。

0