为什么subprocess.call()没有按预期运行命令?

时间:2013-10-26 03:16:09

标签: python bash subprocess echo wkhtmltopdf

这里有一个利基场景,直接测试你需要wkhtmltopdf(在这种情况下,监听端口7000 w / --read-args-from-stdin)并作为守护进程运行(和一个方便的html手头上的文件。)

如果我这样做:

echo "-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my.pdf" | nc localhost 7000

然后非常快速地弹出pops /tmp/my.pdf ...我可以连续25次这样做并获得尽可能多的结果,好像我分别上下旋转wkhtmltopdf 25次。

Walp,这意味着我需要能够从我们自己的吃队列的守护进程中调用THIS,而且,我必须等待它完成,然后检查结果是否存在,并相应地勾选成功或失败。

我找到了subprocess.call,但是因为未指定的原因而无法工作......从python提示符开始:

call(['echo', '\"-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my1.pdf\"', '|', 'nc', 'localhost', '7000'])

我明白了:

"-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf" | nc localhost 7000
0

0表示它认为它是成功的......但是,与我从bash本身执行相同的声明时不同,wkhtmltopdf守护程序中没有任何内容。我尝试在那里添加一个额外的'echo',因为打印输出不包括它,但结果相同。

所以...不知何故,这不是以直接输入bash提示符时所做的相同方式处理事物。

想法?专业知识?

谢谢!

1 个答案:

答案 0 :(得分:1)

要解决您的问题,通过shell调用echonc是一种可行但不切实际的方法。

相反,我会做

def call_7000(*a):
    import socket
    s = socket.create_connection(('localhost', 7000))
    s.write(" ".join(str(i) for i in a)
    s.close()

你现在可以称之为

call_7000("-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf")

(除了我不知道“〜/ my.html”是否有效;或许你应该改为os.expanduser('~/my.html')。)

你甚至可以做到

def call_7000(*args, **kwargs):
    import socket
    import itertools
    s = socket.create_connection(('localhost', 7000))
    items = itertools.chain(" ".join("-%s %s" % (k, v) for k, v in kwargs), a)
    s.write(" ".join(str(i) for i in items)
    s.close()

并用

调用它
call_7000("/tmp/my1.pdf", s="letter", T="24mm", R="24mm", B="0mm", g="~/my.html")

如果选项的顺序不相关。