类型错误:无法连接'str'和'NoneType'对象

0 投票
2 回答
13297 浏览
提问于 2025-04-17 15:01
save = "/root/foo/"
PERF_PATH="/root/foobar/"

一开始,我在命令中有两个变量,saveperf_path。不过现在,我想把它们换成更容易理解的名字。

我想创建一个文件夹,最终会把变量 app[a] 存放到这个文件夹里。

direc = os.mkdir(save + i + "-"+ j +"-" + k + "-" +l)

创建一个目录似乎没什么问题。 但是把一个非字符串类型的变量和字符串连接在一起就出现了问题。

cmd = "taskset -c %s" + PERF_PATH + "perf2 stat -t %s e r4008387e1 -f -o" +save + direc + "%s.csv &" % (cpus_list[a],fpid[a],apps[a])
pro= subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, preexec_fn=os.setsid)

TypeError: cannot concatenate 'str' and 'NoneType' objects

cmd = "taskset -c %s" + str(PERF_PATH) + "perf2 stat -t %s e r4008387e1 -f -o" +str(save) + str(direc) + "%s.csv &" % (cpus_list[a],fpid[a],apps[a])

这个错误信息也没帮上什么忙。

有没有什么想法可以解决这个问题?

2 个回答

0

os.mkdir 返回的是 None。

把一个字符串加到 None 上是行不通的。如果你想把不同类型的东西组合成一个字符串,可以试试使用 format 方法:

s = 'hi there number {no}'.format(no=81)

这样写起来更容易读懂,也更方便调试。

3

os.mkdir() 这个函数不会返回任何东西,所以 direc 的值会变成 None。

你可以这样做:

direc = save + i + "-"+ j +"-" + k + "-" +l
os.mkdir(direc)

其实你应该使用 os.path.join() 和字符串格式化来构建路径,这样会更容易阅读:

save = "/root/foo"
PERF_PATH="/root/foobar"

direc = os.path.join(save, '-'.join((i, j, k, l)))
os.mkdir(direc)

对于 subprocess.Popen(),传入一个列表而不是字符串来表示命令和参数,并且把 shell 保持为默认值 False,这样就不需要让 shell 来处理了:

cmd = ['taskset', 
    '-c', cpus_list[a], PERF_PATH, 'perf2', 'stat',
    '-t', fpid[a], 'e', 'r4008387e1',
    '-f', '-o', save, 
    os.path.join(direc, "%s.csv" % apps[a])
]

pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, preexec_fn=os.setsid)

撰写回答