【问题标题】:TypeError: cannot concatenate 'str' and 'NoneType' objectsTypeError:无法连接“str”和“NoneType”对象
【发布时间】:2013-02-07 06:07:23
【问题描述】:
save = "/root/foo/"
PERF_PATH="/root/foobar/"

所以,最初我在cmd 中有变量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])

这也没有多大帮助。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 错误消息告诉您,您尝试添加的变量之一是None。弄清楚它是哪一个。
  • 但是一旦你克服了那个错误,你就会得到一个TypeError: not all arguments converted during string formatting。问题在于% 的优先级高于+,但真正的 问题是您试图同时将字符串连接和% 格式混合在一起,即很难做对,即使你做对了也更难阅读。只需做一个或另一个 - 最好是 % 格式化,或者更好的是 {} 格式化。

标签: python linux


【解决方案1】:

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)

【讨论】:

  • TypeError: not all arguments converted during string formatting 还是有这个问题。那是我似乎不明白的事情。一切都是字符串变量
  • 我花了几分钟才明白我的错误!
  • 模块os.join 不存在.. 我想是想说os.path.join
  • 它似乎不起作用。我仍在试图找出问题所在..我试过了。 os.system(str(cmd)) sh: [taskset,: command not found 这是我得到的错误。
  • @user2015933:不,不要使用os.system(),坚持使用subprocessstr(cmd) 将给出一个以 ['taskset', ...] 开头的字符串,而不是与 shell 兼容的命令。
【解决方案2】:

os.mkdir 返回无。

尝试将字符串添加到 None 是不行的。如果你想构建不同类型的字符串,请尝试使用格式:

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

这种方式可读性更高,因此无论如何都可以调试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多