【问题标题】:How to execute a command prompt command from python如何从python执行命令提示符命令
【发布时间】:2011-03-30 13:10:03
【问题描述】:

我试过这样的方法,但没有效果:

command = "cmd.exe"
proc = subprocess.Popen(command, stdin = subprocess.PIPE, stdout = subprocess.PIPE)
proc.stdin.write("dir c:\\")

【问题讨论】:

  • 你希望这段代码 sn-p 有什么效果?您甚至没有阅读您的流程的输出。
  • 如果我从标准输出读取后,仍然没有显示任何内容,只有命令提示符打开并无限停留
  • 写信后尝试使用proc.communicate(),或至少proc.stdin.flush()
  • 如果您只想列出目录中的文件,请使用os.listdir()

标签: python windows


【解决方案1】:

简单地说:

import os
os.system('dir c:\\')

【讨论】:

    【解决方案2】:

    您可能想尝试这样的事情:

    command = "cmd.exe /C dir C:\\"

    我认为你不能通过管道输入 cmd.exe...如果你来自 unix 背景,那么,cmd.exe 有一些丑陋的疣!

    编辑:根据 Sven Marnach 的说法,您可以通过管道发送到 cmd.exe。我在 python shell 中尝试了以下操作:

    >>> import subprocess
    >>> proc = subprocess.Popen('cmd.exe', stdin = subprocess.PIPE, stdout = subprocess.PIPE)
    >>> stdout, stderr = proc.communicate('dir c:\\')
    >>> stdout
    'Microsoft Windows [Version 6.1.7600]\r\nCopyright (c) 2009 Microsoft Corporatio
    n.  All rights reserved.\r\n\r\nC:\\Python25>More? '
    

    如您所见,您还有一些工作要做(仅返回第一行),但您也许可以让它工作...

    【讨论】:

    • 为了测试,我在 VirtualBox 中启动了 Windows XP 并尝试了 echo dir | cmd - 工作正常。所以你可以通过管道发送到cmd.exe
    • @Sven Marnach:你说得对,它似乎有效,我已经更新了我的答案。
    • 正如我在回答中指出的那样,未能使用 "\n" 终止命令并且未能明确刷新管道是我可以看到的两个主要候选者,为什么海报的代码没有产生任何东西在proc.stdout。 (我错过了 Sven 已经提到在 cmets 中冲洗管道)
    • 在 Windows10 上使用 (I)python3 在 anaconda 中测试答案后,出现错误:TypeError: a bytes-like object is required, not 'str' 。任何人都可以确认它不适用于 Windows10、p​​ython3 或 anaconda 吗?
    • @Jan-Bert 尝试将b 放在它之前,如下所示:b'byte string here'。这可能是由于这个答案的年龄,并且它使用的是 Python 2,而不是 3。查看docs.python.org/3/howto/pyporting.html#text-versus-binary-data
    【解决方案3】:

    试试:

    import os
    
    os.popen("Your command here")
    

    【讨论】:

    • 请提供一些细节。
    【解决方案4】:

    同时使用 ' 和 " 非常适合我(Windows 10、python 3)

    import os
    os.system('"some cmd command here"')
    

    例如打开我的网络浏览器,我可以使用这个:

    os.system('"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"')
    

    (编辑) 为了更轻松地打开浏览器,我可以使用这个:

    import webbrowser
    webbrowser.open('website or leave it alone if you only want to open the 
    browser')
    

    【讨论】:

      【解决方案5】:

      在写入管道后尝试添加对proc.stdin.flush() 的调用,看看事情是否开始像您预期的那样运行。显式刷新管道意味着您无需担心究竟是如何设置缓冲的。

      另外,不要忘记在命令末尾包含 "\n",否则您的子 shell 将在提示符处等待命令输入完成。

      我写过关于使用 Popen 操作外部 shell 实例的更详细信息:Running three commands in the same process with Python

      与该问题中的情况一样,如果您需要在 Windows 机器上跨多个进程外调用维护 shell 状态,此技巧可能很有价值。

      【讨论】:

      • 这个。如果您要通过管道“驱动”cmd.exe,则必须通过管道传输所有内容。包括换行符。
      【解决方案6】:

      从达伦·托马斯的回答(和编辑)中汲取灵感,试试这个:

      proc = subprocess.Popen('dir C:\\', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
      out, err = proc.communicate()
      

      out 现在将包含文本输出。

      这里的关键是subprocess module 已经为您提供了与shell=True 的shell 集成,因此您无需直接调用cmd.exe。

      提醒一下,如果您使用的是 Python 3,这将是字节,因此您可能需要执行 out.decode() 来转换为字符串。

      【讨论】:

        【解决方案7】:

        你为什么要打电话给cmd.execmd.exe 是命令行(shell)。如果要更改目录,请使用os.chdir("C:\\")。如果 Python 可以提供,尽量不要调用外部命令。事实上,大多数操作系统命令都是通过os 模块(和 sys)提供的。我建议您查看os 模块文档以了解可用的各种方法。

        【讨论】:

          【解决方案8】:

          这很简单。您只需要两行代码,只需使用内置函数,它还接受输入并永远运行,直到您停止它。还有引号中的'cmd',保留它并且不要更改它。代码如下:

          import os
          os.system('cmd')
          

          现在只需运行此代码,即可在您的 python 项目中查看整个 windows 命令提示符!

          【讨论】:

            【解决方案9】:

            您可以在 Python 中直接使用以下代码进行操作

            import subprocess
            proc = subprocess.check_output('C:\Windows\System32\cmd.exe /k %windir%\System32\\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f' ,stderr=subprocess.STDOUT,shell=True)
                print(str(proc))
            

            在第一个参数中刚刚执行的用户帐户设置您可以自定义。

            【讨论】:

              【解决方案10】:

              当我访问这个答案时,我寻找一种方法来执行命令行命令并获取其输出。这在 Python 3 中使用 subprocess 模块很容易实现,并且工作方式如下:

              import subprocess
              # You can put the parts of your command in the list below or just use a string directly.
              command_to_execute = ["echo", "Test"]
              
              run = subprocess.run(command_to_execute, capture_output=True)
              
              print(run.stdout) # the output "Test"
              print(run.stderr) # the error part of the output
              

              只要不要忘记 capture_output=True 参数,就可以了。此外,您将获得二进制字符串形式的输出(Python 中的b"something"),但您可以使用run.stdout.decode() 轻松转换它。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-09-18
                • 1970-01-01
                • 2011-10-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多