python - 如何使用命令行停止python脚本
问题描述
我有 python 脚本,它在后台向/从 FTP 服务器下载/上传文件。
run = 1
while run == 1:
get_from_ftp(server, login, password)
我想使用命令行运行和停止我的 python 脚本
像:
myprogram.py start
和myprogram.py stop
myprogram.py stop
当我运行命令变量时,这个想法run
应该得到值 0 并且循环(while
)应该上传/下载最后一个文件并停止。
请建议我如何实现它。
请不要建议使用 kill、ps 和 ctrl+c
解决方案
由于您希望能够通过命令行进行控制,因此一种方法是使用临时“标志”文件,该文件将由 . 创建myprogram.py start
并由myprogram.py stop
. 关键是,当文件存在时,myprogram.py
将继续运行循环。
import os
import sys
import time
FLAGFILENAME = 'startstop.file'
def set_file_flag(startorstop):
# In this case I am using a simple file, but the flag could be
# anything else: an entry in a database, a specific time...
if startorstop:
with open(FLAGFILENAME, "w") as f:
f.write('run')
else:
if os.path.isfile(FLAGFILENAME):
os.unlink(FLAGFILENAME)
def is_flag_set():
return os.path.isfile(FLAGFILENAME)
def get_from_ftp(server, login, password):
print("Still running...")
time.sleep(1)
def main():
if len(sys.argv) < 2:
print "Usage: <program> start|stop"
sys.exit()
start_stop = sys.argv[1]
if start_stop == 'start':
print "Starting"
set_file_flag(True)
if start_stop == 'stop':
print "Stopping"
set_file_flag(False)
server, login, password = 'a', 'b', 'c'
while is_flag_set():
get_from_ftp(server, login, password)
print "Stopped"
if __name__ == '__main__':
main()
可以想象,旗帜可以是其他任何东西。这非常简单,如果您想运行两个以上的实例,那么您至少应该为每个实例命名不同的文件(例如,使用 CLI 参数),以便您可以有选择地停止每个实例。
不过,我确实喜欢@cdarke 提出的关于拦截和处理 CTRL+C 的想法,并且该机制与我的方法非常相似,并且适用于单个实例。
推荐阅读
- javascript - 如何解决无法读取属性“长度”?[反应]
- sql - 如何查找表A中的所有列是否存在于表B中
- java - 将 FlatFileItemReaderBuilder 与用于读取文件的特定 API 集成
- java - arrayList 和 Object 数组的不同类型的错误
- angular - 调用 API 方法:POST Angular 4.4.7
- python - 尝试在 Python 3 中将时间转换为整数
- javascript - 创建倒数计时器并在计时器启动和停止时更新 MySQL 表列值
- javascript - Nested JSON objects returns [Object] in NodeJS
- java - 无需任何认证即可访问 HTTPS 站点 Java
- c# - 在 C# 中查询 dBase 文件