如何在python中编写可以启动和终止子进程的函数?
到目前为止,这是我的代码:
import subprocess
import signal
import time
def myfunction(action):
if action == 'start':
print 'Start subrocess'
process = subprocess.Popen("ping google.com", shell=True)
if action == 'stop':
print 'Stop subrocess'
process.send_signal(signal.SIGINT)
myfunction('start')
time.sleep(10)
myfunction('stop')
当我运行此代码时,我收到此错误:
Traceback (most recent call last):
File "test.py", line 15, in <module>
myfunction('stop')
File "test.py", line 11, in myfunction
process.send_signal(signal.SIGINT)
UnboundLocalError: local variable 'process' referenced before assignment
答案 0 :(得分:1)
您需要保存子流程变量并将其传递给函数。当您致电myfunction('stop')
时,函数范围无处可以获取process
(因此UnboundLocalError
)。
如果没有函数范围,这应该可以正常工作 - 这表明您的问题与函数范围有关,而不是真正的进程处理:
print 'Start subrocess'
process = subprocess.Popen("ping google.com", shell=True)
time.sleep(10)
print 'Stop subprocess'
process.send_signal(signal.SIGINT)
答案 1 :(得分:0)
您需要学习OOP并使用构造函数和析构函数定义MyClass。 假设您不需要运行许多进程副本,并使其更具异国情调,我们可以使用类方法
class MyClass(object):
@classmethod
def start(self)
print 'Start subrocess'
self.process = subprocess.Popen("ping google.com", shell=True)
@classmethod
def stop(self)
self.process.send_signal(signal.SIGINT)
MyClass.start()
MyClass.stop()
这不太理想,因为它允许您创建几个新进程。 在这种情况下,经常使用单独模式,这确保只有一个进程正在运行但它有点过时了。
最小修复(保持myfunction)是将进程保存在变量中:
import subprocess
import signal
import time
def myfunction(action, process=None):
if action == 'start':
print 'Start subrocess'
process = subprocess.Popen("ping google.com", shell=True)
return process
if action == 'stop':
print 'Stop subrocess'
process.send_signal(signal.SIGINT)
process = myfunction('start')
time.sleep(10)
myfunction('stop', process)
答案 2 :(得分:0)
您遇到的问题似乎是由于process
被声明为myfunction
中的局部变量,特别是仅在'start'
if语句中。这个小范围意味着当您致电myfunction('stop')
时,该功能没有“过程”的概念。变量。
有几种方法可以解决这个问题,但最直观的方法是myfunction
在制作一个process
时返回import subprocess
import signal
import time
def myfunction(action, process=None):
if action == 'start':
print 'Start subrocess'
process = subprocess.Popen("ping google.com", shell=True)
return process
if action == 'stop':
print 'Stop subrocess'
process.send_signal(signal.SIGTERM)
process = myfunction('start')
time.sleep(10)
myfunction('stop', process)
,并在需要关闭时将其作为参数。代码看起来像:
npm run watch
我刚刚在2.7.13中运行了它,它运行良好