百度如何搜索到自己的网站,网站在线支付方案,苏州网络推广专员,用微信微博网站来做睡眠经济小编典典这个问题的答案取决于你使用的Python版本。最简单的方法是使用以下subprocess.check_output功能#xff1a; subprocess.check_output([ls, -l])btotal 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n该check_output功能适用于仍在广泛使用的几乎…小编典典这个问题的答案取决于你使用的Python版本。最简单的方法是使用以下subprocess.check_output功能 subprocess.check_output([ls, -l])btotal 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n该check_output功能适用于仍在广泛使用的几乎所有版本的Python(2.7)。2但对于较新的版本不再推荐使用此方法。现代版本的Python(3.5或更高版本) run如果你使用的是Python 3.5或更高版本并且不需要向后兼容则建议使用新run功能。它为该subprocess模块提供了非常通用的高级API 。要捕获程序的输出请将subprocess.PIPE标志传递给stdout关键字参数。然后访问stdout返回CompletedProcess对象的属性 import subprocess result subprocess.run([ls, -l], stdoutsubprocess.PIPE) result.stdoutbtotal 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n返回值是一个bytes对象因此如果你需要正确的字符串则需要decode它。假设被调用的进程返回一个UTF-8编码的字符串 result.stdout.decode(utf-8)total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n所有这些都可以压缩为一种格式 subprocess.run([ls, -l], stdoutsubprocess.PIPE).stdout.decode(utf-8)total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n如果要将输入传递给流程的stdinbytes请将一个对象传递给input关键字参数 cmd [awk, length($0) 5] input foo\nfoofoo\n.encode(utf-8) result subprocess.run(cmd, stdoutsubprocess.PIPE, inputinput) result.stdout.decode(utf-8)foofoo\n你可以通过传递stderrsubprocess.PIPE(捕获到result.stderr)或stderrsubprocess.STDOUT(捕获到result.stdout常规输出)来捕获错误。如果不考虑安全性你还可以shellTrue按照下面的说明通过传递来运行更复杂的Shell命令。与旧的工作方式相比这仅增加了一点复杂性。但是我认为值得这样做现在你仅需使用该run功能就可以完成几乎所有需要做的事情。旧版本的Python(2.7-3.4) check_output如果你使用的是旧版本的Python或者需要适度的向后兼容性则可以使用check_output上面简要介绍的函数。自python 2.7开始可用。subprocess.check_output(*popenargs, **kwargs)它采用与Popen(请参见下文)相同的参数并返回一个包含程序输出的字符串。该答案的开头有一个更详细的用法示例。在Python 3.5及更高版本中check_output等效于run使用checkTrue和stdoutPIPE仅返回stdout属性。你可以通过stderrsubprocess.STDOUT确保错误信息包含在返回的输出-但在Python中通过一些版本stderrsubprocess.PIPE以check_output可引起死锁。如果不考虑安全性你还可以shellTrue按照下面的说明通过传递来运行更复杂的Shell命令。如果你需要通过管道stderr传递输入或将输入传递给流程check_output则将无法完成任务。Popen在这种情况下请参见下面的示例。复杂的应用程序和Python的旧版(2.6及以下版本) Popen如果需要深度向后的兼容性或者需要比check_output提供的功能更复杂的功能则必须直接使用Popen对象这些对象封装了用于子流程的低级API。所述Popen构造器接受单个命令没有参数或列表包含指令作为其第一项其次是任意数量的参数每个作为列表一个单独的项目。shlex.split可以帮助将字符串解析为格式正确的列表。Popen对象还接受用于进程IO管理和低级配置的许多不同参数。发送输入和捕获输出communicate几乎始终是首选方法。如output subprocess.Popen([mycmd, myarg],stdoutsubprocess.PIPE).communicate()[0]要么 import subprocess p subprocess.Popen([ls, -a], stdoutsubprocess.PIPE,... stderrsubprocess.PIPE) out, err p.communicate() print out...foo如果设置stdinPIPEcommunicate还允许你通过以下方式将数据传递到流程stdin cmd [awk, length($0) 5] p subprocess.Popen(cmd, stdoutsubprocess.PIPE,... stderrsubprocess.PIPE,... stdinsubprocess.PIPE) out, err p.communicate(foo\nfoofoo\n) print outfoofoo注艾伦·霍尔的回答这表明在某些系统上你可能需要设置stdoutstderr以及stdin所有PIPE(或DEVNULL)得到communicate工作的。在极少数情况下你可能需要复杂的实时输出捕获。Vartec的答案提出了一条前进的道路但是communicate如果不谨慎使用则其他方法都容易出现死锁。与上述所有功能一样当不考虑安全性时可以通过传递运行更复杂的Shell命令shellTrue。笔记1.运行shell命令shellTrue参数通常对runcheck_output或Popen构造函数的每次调用都会执行一个程序。这意味着没有花哨的bash风格的管道。如果要运行复杂的Shell命令则可以传递shellTrue这三个功能都支持。但是这样做会引起安全问题。如果你要做的不仅仅是轻脚本编写那么最好单独调用每个进程并将每个进程的输出作为输入通过以下方式传递给下一个进程run(cmd, [stdoutetc...], inputother_output)要么Popen(cmd, [stdoutetc...]).communicate(other_output)直接连接管道的诱惑力很强抵抗它。否则你可能会遇到僵局或者不得不做类似此类的骇人听闻的事情。2. Unicode注意事项check_output在Python 2中返回一个字符串但bytes在Python 3中返回一个对象。如果还没有则花一点时间来学习unicode。2020-02-06