【发布时间】:2017-11-10 10:25:09
【问题描述】:
我在 Windows 上使用 Python 2.7 编写了以下代码。我想检查当前python脚本的更新并更新它,如果有更新,通过ftp服务器保留文件名的新版本,然后在通过os.kill和@987654322终止当前后执行新的python脚本@。
我使用了exit 函数方法,但我读到在 Windows 中这仅适用于 atexit 库和默认 python exit 方法。所以我使用了atexit.register() 和信号处理程序的组合。
***necessary libraries***
filematch = 'test.py'
version = '0.0'
checkdir = os.path.abspath(".")
dircontent = os.listdir(checkdir)
r = StringIO()
def exithandler():
try:
try:
if filematch in dircontent:
os.remove(checkdir + '\\' + filematch)
except Exception as e:
print e
ftp = FTP(ip address)
ftp.login(username, password)
ftp.cwd('/Test')
for filename in ftp.nlst(filematch):
fhandle = open(filename, 'wb')
ftp.retrbinary('RETR ' + filename, fhandle.write)
fhandle.close()
subprocess.Popen([sys.executable, "test.py"])
print 'Test file successfully updated.'
except Exception as e:
print e
ftp = FTP(ip address)
ftp.login(username, password)
ftp.cwd('/Test')
ftp.retrbinary('RETR version.txt', r.write)
if(r.getvalue() != version):
atexit.register(exithandler)
somepid = os.getpid()
signal.signal(SIGTERM, lambda signum, stack_frame: exit(1))
os.kill(somepid, signal.SIGTERM)
print 'Successfully replaced and started the file'
使用:
signal.signal(SIGTERM, lambda signum, stack_frame: exit(1))
我明白了:
Traceback (most recent call last):
File "C:\Users\STiX\Desktop\Python Keylogger\test.py", line 50, in <module>
signal.signal(SIGTERM, lambda signum, stack_frame: exit(1))
NameError: name 'SIGTERM' is not defined
但我可以毫无问题地完成工作,除非我在更复杂的脚本中使用当前代码,该脚本给我同样的错误但由于某种原因立即终止。
但另一方面,如果我以正确的方式使用它,signal.SIGTERM,进程会直接终止并且退出函数永远不会执行。这是为什么呢?
如何在 Windows 上进行这项工作并成功获得我上面描述的结果?
【问题讨论】:
-
signal.SIGTERM或者只有 15 个应该可以工作 -
@Artyer 我使用了上面提到的那个。由于某种原因,退出函数永远不会使用 signal.SIGTERM 执行
-
Windows 没有 POSIX 信号。 C 运行时实现了当前进程中标准 C 所需的 6 个,以及非标准
SIGBREAK。 Python 在 Windows 上对os.kill的实现将两个完全不相关的函数混合在一起,它们的事件目标不是同一件事:GenerateConsoleCtrlEvent(将 Ctrl+C 或 Ctrl+Break 事件发送到进程 group附加到当前控制台)和TerminateProcess以立即终止单个进程(如 Unix 上的SIGKILL)。
标签: python windows python-2.7 signals