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

だから、最初は変数saveと. しかし今、読みやすさを向上させるためにそれを置き換えたいと思います。perf_pathcmd

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])

それもあまり役に立ちませんでした。

これを解決する方法はありますか?

4

2 に答える 2

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と、シェルで次のことを処理する必要はありません。

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)
于 2013-02-06T20:04:46.613 に答える
0

os.mkdir は None を返します。

文字列を None に追加しようとしてもダメです。異なる型から文字列を構築したい場合は、フォーマットを使用してみてください:

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

とにかく、この方法ははるかに読みやすく、したがってデバッグ可能です

于 2013-02-06T20:06:56.563 に答える