繁体   English   中英

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

[英]Error when creating directory and then opening a file within it in Python, but no error if directory already exists

我希望创建一个目录,然后在其中打开一个文件,以便在我在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')

但是我得到了错误

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'

如果运行脚本,则可以看到目录已创建。 如果我随后取消注释,

#output_dir = '/work/m/maxwell9/some_name5/'

并注释该行,

output_dir = create_output_dir(work_dir)

然后文件输出正常。 因此,有一些关于创建文件夹,然后在导致错误的同一脚本中对其进行写入的操作。

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

解决的办法是.wait就开处理(如上所述),或者可以使用更便利的包装的一个subprocess.check_outputsubprocess.check_call或(更好),就可以避免subprocess完全通过使用os.mkdiros.makedirs

您可以使用os库而不是subprocess ,这使实现更直接。 尝试用以下方法换出create_output_dir函数:

import os 

def create_output_dir(work_dir):   
    try:
        os.makedirs(work_dir)
    except OSError:
        pass

    return work_dir

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM