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

时间:2016-07-08 04:05:03

标签: python subprocess

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

$sql = "INSERT INTO table (column1, column2, column3) VALUES (?,?,?)";
some_query($sql, [$value1,$value2,$value3]);

但我收到了错误,

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/'

然后文件输出正常。所以有一些关于创建文件夹,然后在导致错误的同一脚本中写入它。

2 个答案:

答案 0 :(得分:5)

subprocess.Popen启动外部流程,但除非您告知(例如,通过在返回的Popen实例上调用.wait),否则不会等待它完成。最有可能的是,mkdir正在创建目录,而open(filename, 'w')尝试在该目录中创建文件。这是"race condition"

的示例

解决方案是打开进程的.wait(如上所述),或者你可以使用其中一个方便包装subprocess.check_outputsubprocess.check_call或(甚至更好),你可以使用os.mkdirsubprocess完全避免os.makedirs

答案 1 :(得分:1)

您可以使用os库而不是subprocess,这样可以更直接地实现。尝试使用以下代码替换create_output_dir函数:

import os 

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

    return work_dir