Python TypeError:无法连接';str';和';非类型';物体

Python TypeError:无法连接';str';和';非类型';物体,python,linux,Python,Linux,因此,最初我在cmd中有变量save和perf_path。但是现在,我想用它来代替增强的可读性 我想创建一个文件夹,变量app[a]最终将被存储到其中 save = "/root/foo/" PERF_PATH="/root/foobar/" 创建目录似乎不是问题。 但是将非字符串值变量连接到字符串似乎是一个问题 direc = os.mkdir(save + i + "-"+ j +"-" + k + "-" +l) TypeError:无法连接'str'和'NoneType'对象 cmd

因此,最初我在
cmd
中有变量
save
perf_path
。但是现在,我想用它来代替增强的可读性

我想创建一个文件夹,变量
app[a]
最终将被存储到其中

save = "/root/foo/"
PERF_PATH="/root/foobar/"
创建目录似乎不是问题。 但是将非字符串值变量连接到字符串似乎是一个问题

direc = os.mkdir(save + i + "-"+ j +"-" + k + "-" +l)
TypeError:无法连接'str'和'NoneType'对象

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)
那也没什么帮助

有没有办法解决这个问题?

os.mkdir()
不返回任何内容,因此
direc
被设置为无

改为这样做:

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])
您确实希望使用
os.path.join()
和字符串格式来构建路径,但这样会更容易阅读:

direc = save + i + "-"+ j +"-" + k + "-" +l
os.mkdir(direc)
对于
subprocess.Popen()
,为命令和参数传入一个列表而不是字符串,并将
shell
保留为默认值
False
,不需要具有以下shell句柄:

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

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

改为这样做:

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])
您确实希望使用
os.path.join()
和字符串格式来构建路径,但这样会更容易阅读:

direc = save + i + "-"+ j +"-" + k + "-" +l
os.mkdir(direc)
对于
subprocess.Popen()
,为命令和参数传入一个列表而不是字符串,并将
shell
保留为默认值
False
,不需要具有以下shell句柄:

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

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

尝试将字符串添加到“无”是不允许的。如果要使用不同类型构建字符串,请尝试使用格式:

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)
这种方式更具可读性,因此可调试,不管怎样,os.mkdir都不会返回None

尝试将字符串添加到“无”是不允许的。如果要使用不同类型构建字符串,请尝试使用格式:

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)

这种方式更具可读性,因此更易于调试,不管怎样

错误消息告诉您,您试图添加的变量之一是
None
。找出它是哪一个。但是一旦你通过了那个错误,你会得到一个
TypeError:不是所有的参数都在字符串格式化过程中被转换。问题在于,
%
的优先级高于
+
,但真正的问题是,您试图同时将字符串连接和
%
格式混合在一起,这很难做到正确,即使正确,也更难阅读。只需执行一个或另一个理想的
%
格式化,或者更好的是,
{}
格式化。错误消息告诉您,您尝试添加的变量之一是
。找出它是哪一个。但是一旦你通过了那个错误,你会得到一个
TypeError:不是所有的参数都在字符串格式化过程中被转换。问题在于,
%
的优先级高于
+
,但真正的问题是,您试图同时将字符串连接和
%
格式混合在一起,这很难做到正确,即使正确,也更难阅读。只需执行一个或另一个理想的
%
格式化,或者更好的是,
{}
格式化。
TypeError:在字符串格式化过程中并非所有参数都被转换
它仍然存在此问题。这似乎是我不明白的。一切都是一个字符串变量我花了几分钟才明白我的错误!。模块
os.join
不存在。。我想我们是想说
os.path.join
它似乎不起作用。我仍在努力弄清楚问题是什么。。我试过了
os.system(str(cmd))
sh:[taskset,:command not found
这就是我得到的错误。@user2015933:不,不要使用
os.system()
,坚持使用
子流程
str(cmd)
将给出一个以
['taskset',…]开头的字符串
,不是与shell兼容的命令。
TypeError:不是所有参数在字符串格式化过程中都被转换了
它仍然存在这个问题。这是我似乎不明白的。一切都是字符串变量。我花了几分钟才明白我的错误。
os.join
模块不在那里。我想我们是想说
os.path.join似乎不起作用。我仍在试图找出问题所在。我尝试了。
os.system(str(cmd))
sh:[taskset,:command not found
这是我得到的错误。@user2015933:不,不要使用
os.system()
,坚持使用
子流程
str(cmd)
将给出一个以
['taskset',…]开头的字符串
,而不是与shell兼容的命令。