在命令行中执行Python多行语句,而在python

时间:2017-04-18 12:24:08

标签: python python-3.x command-line

我有成千上万的小型多行python3程序要运行,这些程序是作为字符串生成的。它们都具有相似的结构,并以print命令结束。这是一些简单的例子

prog_1 = 'h=9\nh=h+6\nprint(h)'
prog_2 = 'h=8\nh-=2\nprint(h)'
prog_3 = 'c=7\nc=c+4\nprint(c)'

如果您要从解释器运行它们,它们应该都是可执行的。我的意思是,当你打印它们时,它们看起来像小的普通程序,

>>> print(prog_1)
h=9
h=h+6
print(h)


>>> print(prog_2)
h=8
h-=2
print(h)


>>> print(prog_3)
c=7
c=c+4
print(c)

我想从我的程序中执行它们(生成它们),并将输出(即print的输出)捕获为变量,但是我被困住了怎么办?

这样的东西
import os
output = os.popen("python -c " +  prog_1).read()

会很棒,但我收到了这个错误?

/bin/sh: 3: Syntax error: word unexpected (expecting ")")

我认为问题是我不知道如何从命令行执行小程序?这行执行但不打印??

python -c "'h=9\nh=h+6\nprint(h)'"

非常感谢您的帮助:)

3 个答案:

答案 0 :(得分:0)

如果您不受命令行的约束,可以使用:

exec(prog_1)

警告exec()可能非常危险 - Why should exec() and eval() be avoided?

答案 1 :(得分:0)

您可以使用exec

>>> prog_1 = 'h=9\nh=h+6\nprint(h)'
>>> exec(prog_1)
15

答案 2 :(得分:0)

如果您希望在单独的流程中执行它们,那么您可以使用subprocess.run

>>> prog_1 = 'h=9\nh=h+6\nprint(h)'
>>> result = subprocess.run(["python"], input=prog_1, encoding="utf-8", stdout=subprocess.PIPE).stdout
>>> print(result)
15

请注意,encoding支持需要Python 3.6,subprocess.run需要Python 3.5。

在Python 3.5中,您需要将输入作为bytes传递,并且返回的输出也将是字节。

>>> result = subprocess.run(["python"], input=bytes(prog_1, "utf-8"), stdout=subprocess.PIPE).stdout
>>> print(str(result, "utf-8"))
15