我有python脚本,可在后台从FTP服务器下载文件/从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
答案 0 :(得分:0)
while True:
run= int(input("press 1 to run/ 0 to stop: "))
if run == 1:
get_from_ftp(server, login, password)
elif run ==0:
# what you want to do
如果我理解您的问题可能就是这样
答案 1 :(得分:0)
您可以在下面使用-
import sys
import os
text_file = open('Output.txt', 'w')
text_file.write(sys.argv[1])
text_file.close()
if sys.argv[1] == "stop":
sys.exit(0)
run = 1
while run == 1:
# Your code
fw = open('Output.txt', 'r')
linesw = fw.read().replace('\n', '')
fw.close()
if linesw == "stop":
os.remove('Output.txt')
break
sys.exit(0)
我正在使用Python 3.7.0。
像python myprogram.py start
和python myprogram.py stop
一样运行它。
答案 2 :(得分:0)
由于您希望能够通过命令行进行控制,因此,一种方法是使用临时的“标志”文件,该文件将由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的想法,并且该机制与我的方法非常相似,并且可以在单个实例上很好地工作。