顺序使用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]) 

虽然行:始终打印Truesubprocess返回此错误:

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

+1

我能想到的唯一的事情是由沿线某处缓存中的竞争条件。也许目录创建延迟了几分之一秒。也许通过'subprocess.checkoutput'产生的输出流造成足够的延迟,导致目录被创建。简单的检查就是在破损的版本中添加一个有意的等待,看看是否能修复它。当然,我不能肯定地说这些方法不是以不同的方式调用shell,而是遇到了一个边缘情况。希望有更多知识渊博的人可以选择一个 – Basic

+0

我相信你是对的,而这正是导致它的原因。 – DorHugi

我想你有文件权限问题。 在你的路径中,看起来你正在使用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') 
+0

谢谢你的帮助。恐怕这里的权限不是问题。您可以看到成功创建的目录,并且在创建目录之前或使用subprocess.check_output()时,touch命令正常工作。我感兴趣的是为什么我的代码与Popen无法正常工作。 – DorHugi