我正在创建一个文件然后对它进行差异化。
我想对上一步创建的文件执行diff,但是我得到文件不存在的错误。
这是我的代码
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"))
答案 0 :(得分:5)
os.popen
is deprecated. Use the subprocess module。 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)
答案 1 :(得分:1)
os.popen()
已deprecated since version 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"))
答案 2 :(得分: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"))
修改强>
谨慎使用会留下竞争条件,因为正在检查的条件只是文件存在,而不是之前的过程已完成写入。