考虑以下 python 代码(在所有情况下都以 apache 服务器的用户身份运行):
import subprocess as sp
_fname_in ='/path/to/existing/dir/file_in.pdf'
_fname_out='/path/to/existing/dir/file_out.pdf'
_from_page=1
_to_page=4
cmd = [
'/usr/bin/pdftk',
'A=%(_fname_in)s'%locals(),
'cat',
'%(_from_page)s-%(_to_page)s'%locals(),
'output',
'%(_fname_out)s'%locals(),
]
p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE)
output, errors = p.communicate()
上面的代码在 uwsgi 和 ipython 中运行时表现不同:
- ipython - 简单有效。
- 当通过 apache + uwsgi 访问时,代码只会卡在最后一行。
发生这种情况时,ps 输出显示与该命令相关的 2 个进程:
使用 uwsgi python 的 PID 的 PPID 调用 shell,cmd 行如下:
sh -c /usr/bin/pdftk A /path/to/existing/dir/file_in.pdf
- pdftk 进程本身,带有这个“A <>”的东西。
注意现在替换'='
的东西' '
,如果我从 ipython 运行那个命令,我会得到第三种行为:来自 pdftk 的语法错误。令我困惑的是,相同的命令,在相同的外壳下呈现不同的结果。
请解释为什么会发生这种情况......