【问题标题】:check for process stop under shell检查shell下的进程停止
【发布时间】:2012-01-31 21:58:10
【问题描述】:

这是windows环境下python程序的一部分。我正在尝试执行以下操作: 从一个html,我想创建一个pdf然后打开它:

#创建pdf os.system("start wkhtmltopdf.exe result.html %s%s" %(output_directory, pdf_document_name)) #打开当前pdf os.system("开始 %s%s" %(output_directory, pdf_document_name))

问题是有时创建 pdf 的脚本速度较慢,所以我从终端收到错误消息,提示没有具有此名称的文件。
我想问是否只有在创建成功并完成时才可以调用pdf打开。我知道如何通过调用 time.sleep() 来做到这一点,但我认为这不太专业。
非常感谢,
D

【问题讨论】:

    标签: python windows shell process wkhtmltopdf


    【解决方案1】:

    无论您使用何种方法执行 shell 命令(子进程、os.system 等),您都应该在尝试打开文件之前验证文件是否存在。然后,您可以在尝试打开之前将延迟检测到 File-Exists-Else-Wait-Repeat 循环中。 您可以使用os.path.exists()

    #create the pdf
    os.system("start wkhtmltopdf.exe result.html %s%s" %(output_directory, pdf_document_name))
    
    #loop until pdf exists, but add some timer to avoid endless repetition
    maxiterations = 60
    exists = False
    for i in range(maxiterations):
        if os.path.exists(os.path.join(output_directory, pdf_document_name)):
            exists = True
            break;
        time.sleep(1)
    #open the current pdf
    if exists:
        os.system("start %s%s" %(output_directory, pdf_document_name))
    else:
        print 'Could not find file %s to open' % os.path.join(output_directory, pdf_document_name)
    

    要注意的另一件事是,这会引入安全漏洞,因为文件可能会在您验证它和打开它之间发生变化(例如,它可能已被恶意代码替换)。 处理此问题的另一种方法是尝试在 try... except... 块中打开它,但这并不能真正解决安全问题(文件可能已在创建和您尝试打开它之间被替换) .

    【讨论】:

      【解决方案2】:

      我不认为使用time.sleep() 有什么“不专业”的地方。实际上,关于您建议的解决方案,最不专业(或至少 Pythonic)的事情是使用 os.system。请改用 subprocess 模块中的函数。在这种情况下,您可以使用subprocess.call,它会等待程序退出后再继续。例如,如果您在交互式解释器中执行此操作:

      import subprocess, shlex
      subprocess.call(shlex.split('sleep 5'))
      

      您会看到 Python 等待 5 秒钟以等待 sleep 完成,然后再继续。 (然后它返回退出代码。) Shlex 只是将命令行拆分为参数列表,供callsubprocess 提供的几个其他函数和类使用。

      >>> shlex.split("start wkhtmltopdf.exe result.html %s%s" %('out_dir/', 'pdf_name'))
      ['start', 'wkhtmltopdf.exe', 'result.html', 'out_dir/pdf_name']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多