【问题标题】:How do I let Python see what Terminal outputs when I enter a command?当我输入命令时,如何让 Python 查看终端输出的内容?
【发布时间】:2017-07-31 01:35:06
【问题描述】:

我想在 macOS Sierra 上的 Python 上运行一个程序,在我自动输入命令后检查终端的输出。例如,我会在终端中写:

$ pwd

然后终端会输出类似:

/Users/username

如何让 Python 扫描终端输出的内容并将其作为字符串设置为变量?

>>>output = (whatever Terminal outputs)
>>>print (output)
"/Users/username"

顺便说一句,其他论坛没有详细解释如何在 macOS 中执行此操作。因此,这不是任何论坛的重复。

【问题讨论】:

  • 您可以使用sys.stdout 操作stdout
  • 您是否尝试在 Python 脚本中运行 pwd? (在那种特定情况下,os.getcwd() 是您想要的。)或者您想挂接您的外壳?还是专门的 Terminal.app?如果您描述了您正在尝试做什么,这将有所帮助......我怀疑这是一个 X-Y 问题。

标签: python python-2.7 python-3.x terminal macos-sierra


【解决方案1】:

您可以将输出通过管道传输到文件并读取该文件。

$ pwd > output.txt

然后读取文件并根据其内容采取进一步的行动。

【讨论】:

  • 哇,这样真的很有帮助,谢谢!顺便说一句,你能支持我的问题吗?因为我猜人们不喜欢无法像你那样充分回答的问题。
【解决方案2】:

使用subprocess 模块,它有一些捷径可以让事情变得比使用Popen 更简单、更简单。

>>> import subprocess
>>> output = subprocess.check_output("pwd")
>>> print(output)
b'L:\\\r\n'

如果您愿意,您可以使用output.decode("UTF-8") 对其进行解码,或者您可以使用universal_newlines 关键字参数自动完成并整理换行符。

>>> subprocess.check_output("pwd", universal_newlines=True)
'L:\\\n'

编辑:使用@Silvio's 明智的建议,传递所有参数,您可以执行以下操作:

subprocess.check_output(["ls", "-l"])

或者如果你有一个来自其他地方的字符串,你可以调用.split(),它会生成一个由空格分隔的子字符串列表。

subprocess.check_output("ls -l /".split())

注意:我在 Windows 和 Gnu on Windows 上使用 Python3,所以我有 \r\n 行尾和 pwd

【讨论】:

  • 它适用于“pwd”,但不适用于“ls /Applications”或“sudo pwd”之类的东西。我能做些什么来解决这个问题?
  • 您可以尝试在函数调用中添加shell=True。但是有implications,所以你应该确保你清理你的输入。
  • 作为shell=True 的替代方案,考虑将参数作为列表传递。 subprocess.check_output(["sudo", "pwd"])。这是调用 shell 的更清洁、更安全的方式。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多