【问题标题】:python cgi + a web interface for running batch commands?python cgi + 用于运行批处理命令的 Web 界面?
【发布时间】:2012-05-14 12:45:50
【问题描述】:

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

脚本当前运行这些命令:

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

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

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

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

【问题讨论】:

    标签: python shell command-line cgi


    【解决方案1】:

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

    围绕这个模块构建的包装器也很少值得一看:

    1) sh 模块(前 PBS)

    [更新] 如果您无法使用 MS Windows,请使用 PBS,否则请使用其后续版本 sh module

    使用 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'
    

    【讨论】:

      【解决方案2】:

      我认为您可以将 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"])
      

      【讨论】:

        【解决方案3】:

        如前所述,一个很好的方法是使用 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
        

        您可以从这里读取输出或随心所欲地对其进行操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-31
          • 1970-01-01
          • 1970-01-01
          • 2016-11-01
          • 2010-09-23
          相关资源
          最近更新 更多