Python的sh模块 - 后台运行命令包装器

9
当使用Python的sh模块(不是标准库的一部分)时,我可以将路径中的程序作为函数调用并在后台运行:
from sh import sleep

# doesn't block
p = sleep(3, _bg=True)
print("prints immediately!")
p.wait()
print("...and 3 seconds later")

我可以使用sh的Command包装器,并传递可执行文件的绝对路径(如果可执行文件不在我的路径中或具有像.这样的字符,则很有帮助):

import sh
run = sh.Command("/home/amoffat/run.sh")
run()

但是尝试以以下方式在后台运行包装的可执行文件:

import sh
run = sh.Command("/home/amoffat/run.sh", _bg=True)
run()

出现回溯错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument '_bg'

如何在后台运行由sh.Command包装的可执行文件?寻找优雅的解决方案。
编辑:
我使用Python解释器测试将_bg传递给命令(而不是包装器),现在我意识到这是测试阻塞和非阻塞进程的不好方法:
>>> import sh
>>> hello = sh.Command("./hello.py")
>>> hello(_bg=True) # 5 second delay before the following prints and prompt is returned
HI
HI
HI
HI
HI

有一个名为hello.py的文件:

#!/usr/bin/python

import time

for i in xrange(5):
    time.sleep(1)
    print "HI"

你可以使用 popen/subprocess。 - Clarus
1个回答

8
import sh
run = sh.Command("/home/amoffat/run.sh", _bg=True) # this isn't your command, 
                                                   # so _bg does not apply
run()

相反,执行以下操作:

import sh
run = sh.Command("/home/amoffat/run.sh")
run(_bg=True)

(顺便说一句,subprocess 模块提供了一种更加常规的方法来实现这样的事情。)

1
看起来 _bg 对该命令也不适用。这是我在尝试将 _bg 传递到 sh.Command 包装器之前最初尝试的方法。我应该提到这一点。 - billyw
1
@billyw,请发布一个完整可运行的文件以及您执行此操作时的完整回溯信息。 - Mike Graham
你的解决方案并没有导致回溯,而是进程仍在阻塞。结果证明我需要将正在运行的命令分配给一个变量,即 p = run(_bg=True)。仅运行 run(_bg=True) 会导致进程阻塞。不过,你解决了我最初发布的问题,所以我会接受这个答案作为正确答案。 - billyw
1
“事实证明,我需要将运行命令分配给一个变量。” <-- 你还是误解了正在发生的事情。您应该发布完整的、真实的、可运行的代码以及相应的输出,以显示正在发生的情况。 - Mike Graham
我在帖子中添加了更多信息。我是在Python解释器中测试sh,而不是在文件中运行它(糟糕)。感谢您对我的误解进行跟进。 - billyw
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接