python:每次调用脚本时如何以循环方式获取新值

python: how can I get a new value in round robin style every time i invoke the script

我有一个名为 subnets 的文件,其中包含系统中可用子网的列表。 我希望我的脚本应该 return 在每次脚本调用时给我一个子网,以循环方式。

示例:

子网文件:

subnet1
subnet2
subnet3

预期输出:

python next_available_subnet.py    
output: subnet1

python next_available_subnet.py    
output: subnet2

python next_available_subnet.py    
output: subnet3

python next_available_subnet.py    
output: subnet1

我怎样才能做到这一点?我已经尝试过全局变量,迭代器,但是当我再次调用脚本时我丢失了值并且它总是提供与输出相同的子网。

只要您的脚本结束,所有存储在内存中的数据都将被操作系统擦除。在您的应用程序中,您需要跨执行的持久性,这可以使用文件或数据库轻松完成。

只需将停止的位置保存在隐藏文件中(以免意外删除)并在执行脚本之前阅读它。像这样:

import os

# define where to store the index of which file to use
index_file = '.index.txt'

# define your file list or read it from another file
files = ['subnet1', 'subnet2', 'subnet3']

# get your file
if os.path.isfile(index_file):
    with open(index_file) as fd:
        current_index = int(fd.read())
else:
    current_index = 0
current_file = files[current_index]

# process your file here

# increment current_index
current_index += 1
if current_index >= len(files):
    current_index = 0

# now save the last processed file
with open(index_file, 'w') as fd:
    fd.write(str(last_read))

如您所述,您无法通过单个 python 脚本实现此目的。您将需要一个额外的文件,以便脚本记住它当前所在的位置。例如:

#!/usr/bin/env python

import os

LOGFILE='logfile.txt'
SUBNETFILE='subnets.txt'

# Check if LOGFILE exists; if not, initialize it to -1
if not os.path.isfile(LOGFILE):
    with open(LOGFILE,'w') as f:
        f.write('-1')

# Get the current place from the LOGFILE
with open(LOGFILE,'r') as f:
    current = int(f.read().strip())

# Update the current place and read the line from SUBNETFILE
current += 1
with open(SUBNETFILE,'r') as f:
    lines = f.readlines()
current = current%len(lines)

# Update LOGFILE and print the line from SUBNETFILE
with open(LOGFILE,'w') as f:
    f.write(str(current))
print lines[current]

因此,每次 运行 脚本、变量和其他值都会存储在主内存 (ram) 中,只要进程处于 运行ning 状态,它们就会留在那里。在那种情况下,如果不保留值就不可能实现,因为每次 process/script 完成时它都会丢失存储在内存中的所有值。

您可以使用 python 函数 open() 保存值。阅读 this 了解更多信息。希望有帮助 ;)

正如其他答案所指出的,您将需要一些外部方式来提供执行之间的持久性。您可以使用单独的文件、数据库记录或其他一些耗时 运行ning 的过程。

但是,您也可以使用子网文件本身来提供持久性。只需读取文件,打印最高值,然后旋转其内容,为下一个 运行.

做好准备

这个例子使用了一个deque来实现旋转:

import os
import collections

subnets_file = "subnets.txt"

# Load the subnets file into a deque
with open(subnets_file, 'r') as f:
    subnets = collections.deque(f.read().splitlines())

# Print the top subnet
print subnets[0]

# Rotate the subnets
subnets.rotate(-1)

# Save the rotated subnets
with open(subnets_file, 'w') as f:
    for s in subnets:
        f.write("%s\n" % s)

当 运行:

$ python next_available_subnet.py 
subnet1
$ python next_available_subnet.py 
subnet2
$ python next_available_subnet.py 
subnet3
$ python next_available_subnet.py 
subnet1