【问题标题】:Python Script execute commands in TerminalPython 脚本在终端中执行命令
【发布时间】:2011-04-13 10:58:44
【问题描述】:

我不久前在某个地方读到过这篇文章,但似乎找不到。我正在尝试找到将在终端中执行命令然后输出结果的命令。

例如:脚本将是:

command 'ls -l'

它将在终端中运行该命令的结果

【问题讨论】:

标签: python terminal


【解决方案1】:

有几种方法可以做到这一点:

一个简单的方法是使用 os 模块:

import os
os.system("ls -l")

使用 subprocess 模块可以实现更复杂的事情: 例如:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]

【讨论】:

  • 我不想对你投反对票,但是。您应该对所有内容都使用子流程。这样更安全。 subprocess.call() 将为您提供一个不错的界面,以替换简单的调用表单。
  • 感谢您的回答。我将在 Ubuntu 桌面上的第一个应用程序中使用 python,这对我很有帮助。
  • 怎样才能得到一个命令的完整响应,os.system("nslookup gmail.com")只返回最后一行0,但是我想得到完整的响应。
  • @JorgeVargas 你能帮我理解为什么子进程应该用于所有事情吗?为什么更安全?
【解决方案2】:

我更喜欢使用子流程模块:

from subprocess import call
call(["ls", "-l"])

原因是,如果您想在脚本中传递一些变量,这提供了一种非常简单的方法,例如采用以下代码部分

abc = a.c
call(["vim", abc])

【讨论】:

  • 非常适合我打开带有额外参数的图片call(["eog", "1breeproposal.png", "-f"])
【解决方案3】:

事实上,任何关于 subprocess 的问题都值得一读

【讨论】:

    【解决方案4】:
    import os
    os.system("echo 'hello world'")
    

    这应该可行。我不知道如何将输出打印到 python Shell 中。

    【讨论】:

      【解决方案5】:

      您还应该查看 commands.getstatusoutput

      这将返回一个长度为 2 的元组。 第一个是返回整数(0 - 命令成功时) 第二个是终端中显示的整个输出。

      对于 ls

          import commands
          s=commands.getstatusoutput('ls')
          print s
          >> (0, 'file_1\nfile_2\nfile_3')
          s[1].split("\n")
          >> ['file_1', 'file_2', 'file_3']
      

      【讨论】:

        【解决方案6】:

        对于 python3 使用子进程

        import subprocess
        s = subprocess.getstatusoutput(f'ps -ef | grep python3')
        print(s)
        

        【讨论】:

          【解决方案7】:

          在python3中,标准方法是使用subprocess.run

          res = subprocess.run(['ls', '-l'], capture_output=True)
          print(res.stdout)
          

          【讨论】:

            【解决方案8】:

            os.popen() 使用起来非常简单,但自 Python 2.6 起已被弃用。 您应该改用 subprocess 模块。

            在这里阅读:reading a os.popen(command) into a string

            【讨论】:

              【解决方案9】:

              Jupyter

              在 jupyter notebook 中你可以使用魔术函数!

              !echo "execute a command"
              files = !ls -a /data/dir/ #get the output into a variable
              

              ipython

              要将其作为.py 脚本执行,您需要使用ipython

              files = get_ipython().getoutput('ls -a /data/dir/')
              

              执行脚本

              $ ipython my_script.py
              

              【讨论】:

                【解决方案10】:
                • 运行中:subprocess.run
                • 输出:subprocess.PIPE
                • 错误:引发 RuntimeError

                #! /usr/bin/env python3
                import subprocess
                
                
                def run (command):
                    output=subprocess.run(
                        command,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)
                
                    if output.returncode != 0:
                        raise RuntimeError(
                            output.stderr.decode("utf-8"))
                
                    return output
                
                
                output = run ([command, arguments])
                print (output.stdout.decode("utf-8"))
                

                【讨论】:

                  【解决方案11】:

                  您可以导入“os”模块并像这样使用它:

                  import os
                  os.system('#DesiredAction')
                  

                  【讨论】:

                    最近更新 更多