我在函数中有一个像这个cs_id["CS_A1","CS_b7",...]
的列表。在函数结束时,列表中填充了80个值。如何在另一个函数中使用此列表(和值)?在这里,我想在函数cs_id[]
中使用函数unzip中的列表changecs
。 (顺便说一下,第二个功能还没有准备好。)
我还是不明白......不知道为什么。
这是我的完整代码......也许有人可以提供帮助。
maker.py
#!/usr/bin/python
import getopt
import sys
import functions as func
ifile = ''
ofile = ''
instances = 0
def main(argv):
try:
opts, args = getopt.getopt(argv, "hi:o:n:d", ["help", "ifile=", "ofile=", "NumberOfInstances="])
except getopt.GetoptError:
func.usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
func.usage()
sys.exit()
elif opt in '-d':
global _debug
_debug = 1
elif opt in ("-i", "--ifile"):
global ifile
ifile = arg
elif opt in ("-o", "--ofile"):
global ofile
ofile = arg
elif opt in ("-n", "--NumberOfInstances"):
global instances
instances = int(arg)
func.unzip(ifile, instances)
func.changecs()
if __name__ == "__main__":
main(sys.argv[1:])
functions.py
import os
import zipfile
import sys
import string
import random
# printing usage of warmaker.py
def usage():
print "How to use warmaker.py"
print 'Usage: ' + sys.argv[0] + ' -i <inputfile> -o <outputfile> -n <NumberOfInstances>'
# creating random IDs for CS instance e.g. CS_AE, CS_3B etc.
def id_generator(size=2, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
# unzip the reference warfile and build n instances
def unzip(ifile, instances,):
newinstance = ifile
cs_id = []
for i in xrange(instances):
cs_id.append('CS_' + id_generator())
i += 1
print 'Searching for reference file ' + newinstance
if os.path.isfile(newinstance): # check if file exists
print 'Found ' + newinstance
else:
print newinstance + ' not fonund. Try again.'
sys.exit()
print 'Building ' + str(instances) + ' instances... '
for c in xrange(instances):
extract = zipfile.ZipFile(newinstance)
extract.extractall(cs_id[c])
extract.close()
print cs_id[c] + ' done'
c += 1
return cs_id
#def create_war_file():
def changecs(cs_id):
n = 0
for item in cs_id:
cspath = cs_id[n] + '/KGSAdmin_CS/conf/contentserver/contentserver-conf.txt'
if os.path.isfile(cspath):
print 'contentserver-conf.txt found'
else:
print 'File not found. Try again.'
sys.exit()
n += 1
#f = open(cspath)
#row = f.read()
答案 0 :(得分:1)
两种方式。
def unzip(ifile, instances):
# No need for this global
# global cs_id
cs_id = []
# Do stuff
# [...]
# Return the list
return cs_id
在这种情况下,您可以调用unzip并获取完整列表作为返回值:
def changecs(instances):
# The following line is equivalent to
# cs_id = unzip(ifile, instances)
# for c in cs_id:
for c in unzip(ifile, instances):
cspath = cs_id + '/abc/myfile.txt'
def unzip(ifile, instances, cs_id):
# Do stuff
# [...]
在这种情况下,您可以传递解压缩空列表并让它在适当位置进行修改:
def changecs(instances):
cs_id = []
unzip(ifile, instances, cs_id):
for c in cs_id:
cspath = cs_id + '/abc/myfile.txt'
我更喜欢第一种方法。无需提供解压缩空列表。如果你必须在现有的非空列表上调用unzip,第二种方法更适合。
自编辑以来,unzip
返回cs_id
,changecs
将其用作输入。
def unzip(ifile, instances,):
[...]
return cs_id
def changecs(cs_id):
[....]
但你这样称呼他们:
func.unzip(ifile, instances)
func.changecs() # This should trigger an Exception since changecs expects a positional argument
你应该像这样打电话给他们:
variable = func.unzip(ifile, instances)
func.changecs(variable)
或只是
func.changecs(func.unzip(ifile, instances))
答案 1 :(得分:0)
一种可能性是在函数外部初始化列表,然后在两者中调用它,我猜。
答案 2 :(得分:0)
你可以调用该函数并将其返回给另一个函数。不知道你想在哪里使用它,但作为一个例子,这是相同的概念
def foo():
l = [1,3,2,5,4,6,5]
l.append(10)
return l
def bar():
l = foo()
print (l)
return终止函数,在你的情况下,你想把它放在函数的末尾。
答案 3 :(得分:0)
让unzip
返回值。从主要块中调用unzip
。然后将返回值从unzip
传递到changecs
。简单。
def unzip(...):
...
return cs_id
def changecs(cs_id, ...):
... do stuff with cs_id ...
if __name__ == "__main__":
... main block ... # This can be replaced with any kind of driver code
或者,您可以直接从unzip
内拨打changecs
(如果允许该流量)。
答案 4 :(得分:0)
代码就在那里。在def unzip()
的底部,使用cs_id
命令返回数组return
。返回的数组可以存储在运行unzip()
的函数的变量中。在这种情况下,它是我们的主要python函数。
在主函数中的变量中包含cs_id
数组后,将其传递给changecs()
,如:func.changecs(cs_id)
将def main(argv)
的最后两行编辑为:
cs_id = func.unzip(ifile, instances)
func.changecs(cs_id)
在上面的代码中,unzip(ifile, instances)
返回我们的数组cs_id
。我们将其作为参数传递给changecs(cs_id)
。