【问题标题】:Python inline linux commandsPython 内联 linux 命令
【发布时间】:2014-07-27 04:38:17
【问题描述】:

我正在测试排序算法,因此我想在我的 Python 代码中进行编译,即 linux 命令“time”,因为它需要一些有趣的参数,例如快速排序的调用。

from subprocess import Popen
import quicksort
import rand

time=Popen("time quicksort.main(rand.main())")

这是完全错误的,但它是我设法得到的最接近的。子进程类的概念我还没有掌握,是否可以将方法调用与linux命令结合起来,或者只在python中添加“grep...”之类的命令并将输出发送到变量??

【问题讨论】:

标签: python linux command subprocess


【解决方案1】:

如果你从子进程中使用 Popen,你需要做很多不同的事情。

我相信您正在寻找的是 check_output,另一个属于 subprocess 模块的函数。

但为了加深您的理解,由于您有点接近,因此您需要更改以下内容才能使其正常工作:

命令字符串"time quicksort.main(rand.main())" 对 bash 没有任何意义。那是蟒蛇。但在它是有效的 bash 语言的情况下,它需要在单词边界上进行拆分(就像 bash 通常会做的那样),这样你就可以把它列成一个列表:

['time', '...','...']

只有在将关键字中的 shell=True 设置为 Popen 时,才能将命令 STRING(不是列表)传递给 Popen。

但是让我们将 shell 设置为 False,为 bash 做一些分词,然后传入一个列表。进入下一部分。

Popen 返回您可以与之交流/交流的东西。不是过程标准输出的结果。对 Popen 的 stdin 和 stdout 关键字使用 subprocess.PIPE。

一旦你按照描述创建了一个 Popen 对象,你就可以调用它的通信方法。

结果是两个东西,stdout 和 stderr。

你在第一个之后。 Popen 的一个用例是当您需要保持错误和输出分开时。显然,这并不是 inline 的最佳选择,但好吧。让我们处理标准输出。

sdtout 可能需要解码:

stdout.decode()

或者甚至还可以去掉换行符:

stdout.decode().rstrip()

如您所见,Popen 不适合您的用例。无需使用子进程和进行系统调用来为 python 计时。查看timeit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2016-01-03
    • 2015-08-09
    相关资源
    最近更新 更多