如何在Python脚本中可靠检测刚创建的目录是否存在?
目录创建后脚本内检测失败问题解答
问题描述
当系统中不存在/AnewDir目录时,运行以下Python代码后,系统中确实会生成该目录,但脚本内的目录存在检测却无法正确返回状态(即使通过控制台或文件管理器可确认目录存在),即使sleep 3秒也无济于事。
from subprocess import Popen, PIPE from os.path import isdir from time import sleep from os import system #v--- (Miracle-SWITCH) NEW LINE / BACKSPACE #""" Move cursor after the beginning # but before the triple quotes. #^-- Press Return to switch to execution of the code part removing the # directory. Then press Backspace to switch back to execution of the # leading code block (miracle-SWITCH). sudoShCmd = Popen(["sudo", "-S", "mkdir", "/AnewDir"], stdin=PIPE) sudoShCmd.stdin.write(b'PUT YOUR ROOT PASSWORD HERE') # <<< ### sleep(1); print() system("if [ -x /AnewDir ]; then echo isThere; else echo isNotThere; fi") print(f'{isdir("/AnewDir")=}') sleep(3); print() system("if [ -x /AnewDir ]; then echo isThere; else echo isNotThere; fi") print(f'{isdir("/AnewDir")=}') """ sudoShCmd = Popen(["sudo", "-S", "rmdir", "/AnewDir"], stdin=PIPE) sudoShCmd.stdin.write(b'PUT YOUR ROOT PASSWORD HERE') # <<< ### #sleep(1); print() system("if [ -x /AnewDir ]; then echo isThere; else echo isNotThere; fi") print(f'{isdir("/AnewDir")=}') #"""
疑问
- 是否有方法在创建目录的同一段代码内可靠检测该目录是否实际创建成功?
- 我的思路是否存在误区?
- Constantin Hong提供的修改前置代码可让检测生效的方案,是否意味着同脚本内无法可靠检测目录存在?
解答
1. 有可靠的检测方法
核心问题在于你用Popen启动mkdir进程后,未等待它执行完成就开始检测,且stdin处理不规范导致sudo可能未完成认证。正确的实现方式如下:
- 等待
mkdir进程执行完毕,通过退出码判断操作是否成功(0为成功) - 写入密码后必须添加换行符并关闭stdin,确保
sudo能收到完整输入并执行命令 - 用
-d参数检测目录是否存在(而非-x),同时结合os.path.isdir做双重验证
修改后的代码示例:
from subprocess import Popen, PIPE from os.path import isdir from os import system # 启动mkdir进程并处理输入 sudoShCmd = Popen(["sudo", "-S", "mkdir", "/AnewDir"], stdin=PIPE, stderr=PIPE) # 写入密码后加换行符,关闭stdin确保进程能继续执行 sudoShCmd.stdin.write(b'PUT YOUR ROOT PASSWORD HERE\n') sudoShCmd.stdin.close() # 等待进程执行完成,获取退出码 exit_code = sudoShCmd.wait() # 先通过退出码判断mkdir是否执行成功 if exit_code == 0: print("mkdir执行成功,开始检测目录状态") else: err_msg = sudoShCmd.stderr.read().decode() print(f"mkdir执行失败,退出码:{exit_code},错误信息:{err_msg}") # 检测目录存在性 system("if [ -d /AnewDir ]; then echo isThere; else echo isNotThere; fi") print(f'{isdir("/AnewDir")=}')
2. 你的思路存在三个关键误区
- 未等待子进程完成:
Popen是异步启动进程,sleep固定时长无法保证mkdir在检测前执行完毕,系统负载波动会导致执行时间不稳定 - stdin处理不规范:直接写入密码后未关闭stdin或添加换行符,
sudo会一直等待输入完成,mkdir根本没被执行 - 检测参数错误:用
[ -x /AnewDir ]检测的是目录是否可执行,而非是否存在。正确的目录存在性检测应该用[ -d /AnewDir ]
3. 同脚本内完全可以可靠检测目录存在
Constantin Hong的修改方案是解决了子进程等待、stdin处理或检测参数的问题,并非同脚本内无法检测。之前的检测失败完全是因为操作顺序和输入处理错误,只要确保:
- 等待
mkdir进程执行完成 - 正确处理
sudo的密码输入 - 使用正确的检测参数
同脚本内就能准确检测目录是否存在。
内容的提问来源于stack exchange,提问作者user7711283
相关产品推荐
相关产品推荐

