这里有一个小众场景,要直接测试,您需要 wkhtmltopdf (在本例中使用 --read-args-from-stdin 监听端口 7000)作为守护进程启动并运行(以及一个方便的 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,这意味着我需要能够从我们自己的队列守护进程中调用它,此外,我必须等待它完成,然后再检查结果是否存在并相应地标记成功或失败。
我找到了 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 提示符中键入时的方式不同。
想法?专业知识?
谢谢!
最佳答案
要解决您的问题,通过 shell 调用 echo
和 nc
是一种可行但不切实际的方法。
相反,我会这样做
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")
如果选项的顺序不相关。
关于python - 为什么 subprocess.call() 没有按预期运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19602414/