Python - 代码冻结后控制台关闭

Posted

技术标签:

【中文标题】Python - 代码冻结后控制台关闭【英文标题】:Python - Console closes after the code has been frozen 【发布时间】:2016-07-21 16:28:58 【问题描述】:

我用 Python 2.7 编写了一个应用程序,它使用 moviepy 检索媒体文件的长度。如果我从命令行运行它,一切正常;但是在冻结代码后,当我运行它时,控制台窗口会立即关闭。我试过 cx_freeze、pyinstaller 和 py2exe,结果都一样。我的代码有问题还是moviepy有问题?我正在 Windows 10 上进行测试,最终将在 Windows 7 上使用。代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Video-Audio Length Retriever
#
# Version: 0719A
#
# Author: Simon Lachaîne


import codecs
from moviepy.editor import VideoFileClip, AudioFileClip
import os


directories = []


def read_directories():
    global directories
    directories_txt = raw_input("Enter the path and name of the text file containing the source directories: ")

    with codecs.open(directories_txt, "r", encoding="utf8") as source_dirs:
        directories = [line.rstrip() for line in source_dirs]


def write_text(report, text2save):
    with open(report, "a") as report:
        report.write(text2save)


def check_duration():
    for directory in directories:
        for root, dirs, files in os.walk(directory):
            os.chdir(root)
            for fichier in files:

                try:
                    video = VideoFileClip(fichier)

                    m, s = divmod(video.duration, 60)
                    h, m = divmod(m, 60)

                    length = fichier + " ; " + "%02d:%02d:%02d\n" % (h, m, s)
                    write_text(durations_report, length)
                    print "Processed file " + fichier

                except IOError:
                    pass

                except KeyError:
                    try:
                        audio = AudioFileClip(fichier)

                        m, s = divmod(audio.duration, 60)
                        h, m = divmod(m, 60)

                        length = fichier + " ; " + "%02d:%02d:%02d\n" % (h, m, s)
                        write_text(durations_report, length)
                        print "Processed file " + fichier

                    except IOError:
                        pass


read_directories()
durations_report = raw_input("Enter the path and name of the report to create: ")
check_duration()

【问题讨论】:

【参考方案1】:

您可以从命令行运行冻结的代码以查看错误消息。

就 pyinstaller 而言,我在 hooks 文件夹中看不到 moviepy 的钩子,而且很可能它没有捆绑在冻结版本中。您可以将它(或任何其他可能丢失的内容)添加为隐藏导入:https://pythonhosted.org/PyInstaller/when-things-go-wrong.html?highlight=hidden#listing-hidden-imports

【讨论】:

感谢您的回答。错误是“系统找不到指定的路径”,导致moviepy\video\fx,所以问题似乎是moviepy没有包含在冻结的应用程序中。我已经在我的安装脚本中为 cx_freeze 指定了它,我会尝试对 pyinstaller 做同样的事情。考虑到我的问题已得到解答,因为您为我提供了解决问题的方法。

以上是关于Python - 代码冻结后控制台关闭的主要内容,如果未能解决你的问题,请参考以下文章

为啥在第一次输出后控制台冻结输出?

关闭模式视图控制器偶尔冻结应用程序,swift 3

使用 Pyinstaller 冻结 Python 程序时摆脱控制台输出

按下按钮时iOS tableview冻结,控制台没有错误

服务器(GUI)在启动后冻结。在控制台中工作正常

快速更改点击标签栏后刷新控制器冻结