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

标签 python bash subprocess echo wkhtmltopdf

这里有一个小众场景,要直接测试,您需要 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 调用 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")

如果选项的顺序不相关。

关于python - 为什么 subprocess.call() 没有按预期运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19602414/

相关文章:

python - 在 Python 中取消融化 Pandas 数据框?

python - 安装 Python 时使用 pypy 轻松安装

python - 如何操作包含多个元组的元组

linux - 将 node.js 套接字服务器作为服务启动的 BASH 脚本

bash - 在 shell 脚本中,.[!.]* 是什么意思?

python - 为基类的所有子类创建一个可哈希的 id

bash - 使用 printf 格式化输出 : truncating or padding

python - 将ffmpeg与python一起使用,在找到END元素之前输入缓冲区已耗尽

python - 在 python 中随时间监控子进程资源

python - 如何使用 sshfs 和 Python 子进程挂载和卸载文件夹?