0

我正在创建一个文件,然后对其进行比较。

我想对上一步中创建的文件进行比较,但我得到文件不存在的错误。

这是我的代码

os.popen("mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables  --skip-extended-insert -c %s > %s.sql" % (database, filename))
os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH"))
4

3 回答 3

5

os.popen已弃用。使用子流程模块subprocess.call将阻塞主进程,直到命令完成。您应该检查返回码 ,以防在执行命令retval时出现错误。mysqldump在这种情况下,您不能继续diff

import subprocess
import shlex
with open("{f}.sql".format(f=filename), 'w') as fout:
    retval = subprocess.call(
        shlex.split(
            """mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables
            --skip-extended-insert -c %s""" % (database, )),
        stdout=fout)

if not retval == 0:
    raise Exception('Error executing command: {r}'.format(r=retval))
else:
    with open("{f}.PATCH".format(f=filename), 'w') as fout:
        retval = subprocess.call(
            shlex.split("diff {w} {f}".format(w=weekly, f=filename)),
            stdout=fout)
于 2013-07-15T09:52:38.970 回答
1

os.popen()自 2.6 版以来已被弃用。但是,为了让您的代码正常工作,您应该等待第一个进程完成(以及要创建的输出文件),然后再开始第二个进程。

第一个命令的退出状态可以作为返回close()的文件对象的方法的返回值,因此您可以在继续之前检查它,即:

pipe = os.popen("mysqldump --login-path=server1_mysql -e --opt "
                "--skip-lock-tables  --skip-extended-insert -c %s > %s.sql" % 
                (database, filename))
if pipe.close() is None:  # no errors?
    os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH"))
于 2013-07-15T10:54:32.740 回答
0

一个超级简单的方法是使用忙等待:

os.popen("mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables  --skip-extended-insert -c %s > %s.sql" % (database, filename))
while not os.path.isfile(filename):
    sleep(0.05) # or some other interval
os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH"))

编辑:

小心使用,留下竞争条件,因为正在检查的条件只是文件存在,而不是前一个过程完成写入。

于 2013-07-15T09:52:43.890 回答