在VMS上用Python创建简单的CGI网络服务器
我正在尝试在VMS上用Python运行一个非常简单的CGI服务器。
import sys
from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler
server_address=('',8080)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()
我遇到的问题是,它可以正确提供静态内容,并且尝试执行CGI程序(这些程序放在正确的位置,我之前在Apache上用过这些CGI,所以这部分肯定没问题),但是它在某个地方卡住了。我对VMS的一些事情不太了解。
如果能给我一些正确的方向,我会非常感激。:)
更新:简单来说,我需要在VMS上执行一个程序,并以某种方式获取这个程序的结果。关于如何执行子进程并获取它们的结果的任何参考资料对我来说都足够了。
3 个回答
-1
在posix系统上执行一个子进程并获取它的输出:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import Popen, PIPE
>>> output = Popen(['/bin/ls', '/'], stdout = PIPE).communicate()[0]
>>> print output
bin
boot
dev
etc
home
..snip..
root
sbin
>>>
这明显是在Linux上,所以我不太清楚VMS系统在Python或子进程模块方面的具体情况。
0
CGIHTTPServer.py
文件会使用 os.fork
,如果这个功能可用的话;如果不可用,就会使用 subprocess.Popen
。
你可以查看 run_cgi
方法 的源代码。
可以尝试一下 subprocess
模块,看看它在 VMS 系统上是怎么工作的。
1
你是在使用来自 http://hg.vmspython.org/vmspython/ 的Python版本吗?
如果是的话,我觉得 这个讨论串 和 这个文件(看起来是实现了一种 popen2
的功能)可能会对你有帮助。这个版本里似乎有一些专门针对VMS的模块(至少有 vms.starlet
、vms.rtl.lib
、vms.dvidef
、vms.clidef
),它们提供了与VMS的 spawn
函数等功能的接口。不过,相关的文档似乎不太完整,甚至没有。