如题,最近在用spyder进行py代码的编写,直接运行.py文件时,因为里面要读取一个文件,所以有这么一行代码:
datafile = sys.argv[1]
运行后会报超过列表范围的错误,好在作者在后面标注了:one-indexed, whitespace separated,
我自己是于是这样运行文件:
run presampled_bpr.py sample.txt
发现可以运行。但我现在想单步调试。按crl+f5进入后单步调试,发现又在argv[1]中报前面相同的错,想请问各位
如何在ipdb下运行并传入argv[1]的参数。
下面是完整代码:
[code=python"""
Precompute a schedule of samples and use it to train
a BPR model.
Sampling is done in a map-reduce style.
"""
from bdoopr import *
import toydoop
from bpr import BPR, BPRArgs, ExternalSchedule
from numpy import loadtxt
from scipy.sparse import coo_matrix
import sys
#strip() is used to remove the head and bottom character specified by usr
#str = '0000 my 0000'
#print str.strip('0')
# [output] my
#split
def parser(line):
return map(int,line.strip().split()[:2])
def formatter(key,val):
return '{0}\t{1}\t{2}'.format(key,val[0],val[1])
datafile = sys.argv[1] # one-indexed, whitespace separated
sample_file = datafile+'.samples'
tmp1 = sample_file+'.tmp1'
tmp2 = sample_file+'.tmp2'
print 'reading data...'
data = loadtxt(datafile)
print 'converting to zero-indexed sparse matrix...'
#data = array([[ 1., 2., 4., 5.],
# [ 8., 3., 6., 9.]])
#data[:,:2]
#Out[45]:
#array([[ 1., 2.],
# [ 8., 3.]])
idxs = data[:,:2]-1
vals = data[:,2]
data = coo_matrix((vals,idxs.T)).tocsr()
user_item_counts = dict((i+1,data[i].getnnz()) for i in xrange(data.shape[0]))
print 'creating samples...'
mapper1 = Mapper1(user_item_counts,oversampling=10)
print 'map-red1...'
toydoop.mapreduce(datafile,tmp1,mapper=mapper1,reducer=reducer1,parser=parser)
print 'map2...'
toydoop.mapreduce(datafile,tmp2,mapper=mapper2,parser=parser) # map the data again
#from ipdb import set_trace
#set_trace()
print 'red2...'
toydoop.mapreduce([tmp1,tmp2],sample_file,reducer=reducer2,formatter=formatter)
print 'training...'
args = BPRArgs()
args.learning_rate = 0.3
num_factoras = 10
print 'gui...'
model = BPR(num_factors,args)
sampler = ExternalSchedule(sample_file,index_offset=1) # schedule is one-indexed
num_iters = 50
model.train(data,sampler,num_iters)
][/code]
谢谢各位