将bash脚本转换为python3

时间:2016-12-30 22:14:50

标签: python bash subprocess

我有一个运行完美的bash脚本:

gvim  --servername "servername" $1
if [ -f ${1%.tex}.pdf ];
then
  evince ${1%.tex}.pdf &
fi
evince_vim_dbus.py  GVIM servername ${1%.tex}.pdf  $1 &

我正在尝试将其转换为python:

#!/usr/bin/env python3

from subprocess import call
import sys, os

inp_tex = sys.argv[1]
oup_pdf = os.path.splitext(sys.argv[1])[0]+".pdf"
print(oup_pdf)

call(["gvim", "--servername", "servername",  sys.argv[1]])

if os.path.exists(oup_pdf):
  call(["evince", oup_pdf])

call(["evince_vim_dbus.py", "GVIM", "servername", oup_pdf, inp_tex])
在python中,gvim和evince窗口都是打开的,但evince_vim_dbus.py行无法正常工作。并不是它提供任何错误,但它没有显示预期的结果,因为它应该,并且正在使用bash脚本。

尝试使用 check_call (我必须在一段时间后杀死它,这是追溯):

追踪(最近一次呼叫最后一次):

  File "/home/rudra/vims.py", line 28, in <module>
    check_call(["python","/home/rudra/bin/evince_vim_dbus.py", "GVIM", "servername", oup_pdf, inp_tex])
  File "/usr/lib64/python3.5/subprocess.py", line 576, in check_call
    retcode = call(*popenargs, **kwargs)
  File "/usr/lib64/python3.5/subprocess.py", line 559, in call
    return p.wait(timeout=timeout)
  File "/usr/lib64/python3.5/subprocess.py", line 1658, in wait
    (pid, sts) = self._try_wait(0)
  File "/usr/lib64/python3.5/subprocess.py", line 1608, in _try_wait
    (pid, sts) = os.waitpid(self.pid, wait_flags)
KeyboardInterrupt

1 个答案:

答案 0 :(得分:1)

我猜测你的真正问题不是evince_vim_dbus.py行本身,而是gvim行,因为你将服务器名称'servername'传递给它只是servername,因此与运行evince_vim_dbus.py的行上的名称不匹配。

我不熟悉gvim或其服务器功能,但我猜测evince_vim_dbus.py程序使用给定名称连接到gvim,在这种情况下,由于正确名称的服务器不存在,它将失败跑了。

如果不是这样,那么可能问题是subprocess.call()运行给定的程序并等待它退出,而在原始的bash脚本中,你用&符号运行evince,导致bash不要等待它,所以问题是evince_vim_dbus.py永远不会运行,直到退出Evince。