python 踩坑记录

最近有个需求是对图片进行批量压缩存储在临时目录中,然后批量上传到oss上

# 遍历目录 将图片压缩到临时目录
for root, dir, files in os.walk(dirpath):
    for file in files:
        cmd = "convert -quality 50 %s %s" % (os.path.join(root, file), os.path.join(tmp_dir, file))
        os.popen(cmd)

# 遍历临时目录 批量上传操作
for file in os.listdir(tmp_dir):
    print(file)

打印dir的值发现,每次打印的文件数量不一致,找到半天没发现原因,最后猜测会不会是上面压缩图片的shell命令还没执行完毕,就继续执行后面的遍历操作导致这个问题,于是加了个延时操作time.sleep(1),发现代码正常了

可以看到os.popen执行shell时是没有阻塞的,可以考虑手动加阻塞或者使用

subprocess.call(cmd,shell=True)

# subprocess.call() 函数说明
def call(*popenargs, timeout=None, **kwargs):
    """Run command with arguments.  Wait for command to complete or
    timeout, then return the returncode attribute.

    The arguments are the same as for the Popen constructor.  Example:

    retcode = call(["ls", "-l"])
    """
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise

你可能感兴趣的:(python 踩坑记录)