创建目录然后在Python中打开文件时出错,但如果目录已存在则没有错误

Max*_*Max 2 python subprocess

我希望创建一个目录,然后在其中打开一个文件,以便在我在Python 2.6.6中执行下面的代码时写入,

import subprocess

def create_output_dir(work_dir):
    output_dir = '/work/m/maxwell9/some_name5/'
    subprocess.Popen(['mkdir', output_dir])
    return output_dir

if __name__ == '__main__':
    work_dir = '/work/m/maxwell9/'
    output_dir = create_output_dir(work_dir)
    #output_dir = '/work/m/maxwell9/some_name5/'
    filename = output_dir + 'bt.sh'
    with open(filename, 'w') as script:
        print('there')
Run Code Online (Sandbox Code Playgroud)

但我得到了错误,

Traceback (most recent call last):
  File "slurm_test.py", line 13, in <module>
    with open(filename, 'w') as script:
IOError: [Errno 2] No such file or directory: '/work/m/maxwell9/some_name5/bt.sh'
Run Code Online (Sandbox Code Playgroud)

如果我运行脚本,我可以看到该目录已创建.如果我然后取消注释该行,

#output_dir = '/work/m/maxwell9/some_name5/'
Run Code Online (Sandbox Code Playgroud)

并评论该线,

output_dir = create_output_dir(work_dir)
Run Code Online (Sandbox Code Playgroud)

然后文件输出正常.因此,有一些关于创建文件夹,然后在导致错误的同一脚本中写入该文件夹.

mgi*_*son 5

subprocess.Popen启动外部进程但不等待它完成,除非你告诉它(例如通过调用.wait返回的Popen实例).最有可能的mkdir是,在open(filename, 'w')尝试在该目录中创建文件时正在创建目录.这是"竞争条件"的一个例子.

解决方案是.wait在开放过程中(如上所述),或者您可以使用其中一个便利包装器subprocess.check_output,subprocess.check_call或者(甚至更好),您可以subprocess完全避免使用os.mkdiros.makedirs.