在 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
on the returned Popen
instance). Most likely, mkdir
is in the process of creating a directory while open(filename, 'w')
attempts to create a file in that directory. This is an example of a "race condition".
解决方案是在打开过程中 .wait
(如上所述),或者您可以使用便捷包装器之一 subprocess.check_output
、subprocess.check_call
or (even better), you can avoid subprocess
entirely by using os.mkdir
或 os.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
我希望在 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
on the returned Popen
instance). Most likely, mkdir
is in the process of creating a directory while open(filename, 'w')
attempts to create a file in that directory. This is an example of a "race condition".
解决方案是在打开过程中 .wait
(如上所述),或者您可以使用便捷包装器之一 subprocess.check_output
、subprocess.check_call
or (even better), you can avoid subprocess
entirely by using os.mkdir
或 os.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