顺序使用mkdir和触摸子进程不起作用
我有一个错误,我一直不断遇到,可悲的是无法找到解决方案在网站上。顺序使用mkdir和触摸子进程不起作用
try:
#create working dir if it doens't exist already
if not os.path.isdir(WORKINGDIR):
print '>>>mdkir ',WORKINGDIR
subprocess.Popen(['mkdir',WORKINGDIR]).wait()
print os.path.isdir(WORKINGDIR)
#create output csv file
outputCSVFile = WORKINGDIR+ '/'+'results.csv'
if not os.path.isfile(outputCSVFile):
print '>>> touch',outputCSVFile
subprocess.check_output(['touch',outputCSVFile])
虽然行:始终打印True
,subprocess
返回此错误:
touch: cannot touch `/nfs/iil/proj/mpgarch/archive_06/CommandsProfiling/fastScriptsOutput190916/results.csv': No such file or directory
,当我用subprocess.checkoutput
代替subprocess.Popen().wait()
同样的错误不会出现。 我知道这个问题可以通过很多方式解决(例如使用os
方法来创建目录和文件),但我对我的方式不工作的原因感兴趣。
在此先感谢。
编辑:如一些建议,问题可能在于事实上,该程序在subprocess.Popen
之后继续太快,因此使用subprocess.checkoutput
解决该问题可能较慢(因为它必须等待输出)。但仍然 - 我不明白究竟发生了什么,因为os.path.istdir
表明该dir创建,继续执行该行之前touch
我想你有文件权限问题。 在你的路径中,看起来你正在使用NFS。你已经在本地文件系统上试过了吗?
无论如何,你应该避免使用子进程进行简单的文件操作。
要创建一个目录:
if not os.path.exists(WORKINGDIR):
os.makedirs(WORKINGDIR)
对于触摸:
import os
def touch(fname, times=None):
with open(fname, 'a'):
os.utime(fname, times)
touch(WORKINGDIR+ '/'+'results.csv')
谢谢你的帮助。恐怕这里的权限不是问题。您可以看到成功创建的目录,并且在创建目录之前或使用subprocess.check_output()时,touch命令正常工作。我感兴趣的是为什么我的代码与Popen无法正常工作。 – DorHugi
我能想到的唯一的事情是由沿线某处缓存中的竞争条件。也许目录创建延迟了几分之一秒。也许通过'subprocess.checkoutput'产生的输出流造成足够的延迟,导致目录被创建。简单的检查就是在破损的版本中添加一个有意的等待,看看是否能修复它。当然,我不能肯定地说这些方法不是以不同的方式调用shell,而是遇到了一个边缘情况。希望有更多知识渊博的人可以选择一个 – Basic
我相信你是对的,而这正是导致它的原因。 – DorHugi