2

我正在将通过命令行运行的 Python 脚本移植到 Python CGI,这样我就可以使用 HTML 表单元素控制选项。如何访问命令的结果?

脚本当前运行以下命令:

  • svn更新
  • rsync 从其他本地文件夹复制图像
  • 重新编译 CSS
  • svn commit *循环这些命令十几次

    #!/usr/bin/python
    print 'Content-Type: text/plain'
    print
    print 'test...'
    os.system("svn update /Users/daverau/titles/or_mm_creating_website_3e")
    

如何访问此命令的控制台输出?有没有更好的方法来设置这种本地工作?

安全不是问题,这只是我自己的本地 Mac 工具。

4

3 回答 3

2

这两个很好的答案为您指出了子流程模块。

还有一些围绕这个模块构建的包装器非常值得一看:

1)sh模块(前PBS)

[更新] 如果您被 MS Windows 卡住,请使用 PBS,否则使用它的继任者sh 模块

使用 sh 模块:

from sh import ifconfig, ls
print(ifconfig("eth0"))
print(ls('-la'))

使用 PBS,来自https://github.com/amoffat/pbs的自述文件:

import pbs
print pbs.ifconfig("eth0")
print pbs.ls('-la')

2) 铅锤

详细信息见 http://plumbum.readthedocs.org/en/latest/

README 文件中的一些示例:

基本:
>>> from plumbum import local, FG, BG
>>> from plumbum.cmd import ls, grep, wc, cat, head
>>> ls
LocalCommand(<LocalPath /bin/ls>)
>>> ls()
u'build.py\ndist\ndocs\nLICENSE\nplumbum\nREADME.rst\nsetup.py\ntests\ntodo.txt\n'
管道:
>>> chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]
>>> print chain
/bin/ls -a | /bin/grep -v '\.py' | /usr/bin/wc -l
>>> chain()
u'13\n'
重定向:
>>> ((cat < "setup.py") | head["-n", 4])()
u'#!/usr/bin/env python\nimport os\n\ntry:\n'
>>> (ls["-a"] > "file.list")()
u''
>>> (cat["file.list"] | wc["-l"])()
u'17\n'
于 2012-05-16T06:40:02.853 回答
0

如前所述,一个很好的方法是使用 subprocess 模块。便利功能将call允许您重新分配 STDIN/STDOUT/STDERR,但它具有潜在的风险,因为call自动阻塞直到完成,如果您填充 I/O 管道,这可能会产生死锁。我建议只使用Popen

import subprocess
p = subprocess.Popen( ["svn", "update", "/Users/daverau/titles/or_mm_creating_website_3e"], subprocess.PIPE )
out = p.communicate()[0]  # 0 is STDOUT

从这里您可以读取输出或随心所欲地操作它。

于 2012-05-05T05:26:41.247 回答
0

我认为您可以将 subprocess.call 用于此用例:

from subprocess import call
print 'Content-Type: text/plain'
print
print 'test...'
response = call(["svn", "update", "/Users/daverau/titles/or_mm_creating_website_3e"])
于 2012-05-05T01:41:06.723 回答