2013-07-15 174 views
0

我正在创建一个文件,然后对其进行区分。python代码是否按顺序执行

我想对上一步创建的文件做差异,但我得到的文件不存在的错误。

这是我的代码

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")) 

回答

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")) 
+0

感谢兄弟,只有我们的代码工程。这可能并不完美,但工作 – user22

+0

很高兴听到,但是你真的应该转换你的代码在某个时候使用'subprocess.call()' - 它绝对更好,通常使用起来相对更容易。 – martineau

5

os.popen is deprecated. Use the subprocess modulesubprocess.call将阻止主进程,直到命令完成。如果在执行mysqldump命令时发生错误,则应检查返回码retval。在这种情况下,你不能继续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) 
+0

在这种情况下,没有什么'沟通',所以调用'proc.wait()'更简单。但总的来说,是的(upvoted)。 – torek

+0

@torek:对。谢谢! – unutbu

+0

哦,另一件我刚才注意到的事情是:使用'shlex.split'通常很好,但在这种情况下,字符串期望shell执行重定向,因此您需要'shell = True'并且不想分割串。或者(比试图引用shell元字符更安全),在Python中打开输出文件并在子进程调用中将其作为'stdout ='传递。 – torek

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")) 

编辑:

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

+1

繁忙的等待*很简单,但不必要;这会导致竞争状态:差异可能会在mysqldump已启动但mysqldump完成之前启动。 – torek

+0

果然,这可能有点简单。我仍然认为学习简单(如果你喜欢上学),像忙碌的等待这样的解决方案是有用的,在某些情况下,它仍然是必要的。但我同意在这种情况下它不是最理想的。 – Henrik