0

我父亲正在开发一个程序,除其他外,该程序需要 ping 一台机器。它是多线程的,他构建了一个 ping 方法,可以在需要时从任何一个线程调用:

def ping_cmd(ip):
    if hasattr(sys.stderr, "fileno"):
        nstderr = sys.stderr
    elif hasattr(sys.stderr, "_file") and hasattr(sys.stderr._file, "fileno"):
        nstderr = sys.stderr._file
    else:
        nstderrPath = "nul"
        nstderr = file(nstderrPath, "a")

    p = subprocess.Popen("ping -n 1 %s" % ip,
                         stdout=subprocess.PIPE,
                         stderr=nstderr,
                         stdin=subprocess.PIPE,
                         shell=True
                        )
    result = p.communicate()[0]
    ...

if-else 块语句按照此处的建议编写:http: //www.py2exe.org/index.cgi/Py2ExeSubprocessInteractions

该代码在使用 python 从命令行运行时运行良好(他对其进行了测试,线程进行了多次 ping,没有错误),但我父亲需要的是使其成为 Windows 可执行文件,所以当他使用py2exe时,会出现以下奇怪的行为:第一次调用此方法后程序退出,即使主线程是一个无限循环。

即使它没有界面,它也被编译为 GUI 应用程序,因为这很容易使进程在后台运行,我不知道这是否是实现这一目标的最佳方法,但也许它很有用。

我从未使用过 py2exe,因为我的大部分工作都在 linux 机器上,但在我看来,这与使用 py2exe 编译时混合线程与生成进程的组合有关。

py2exe 编译代码的特定选项:

setup(
options = {"py2exe": {"compressed": 1,
                      "optimize": 2,
                      "ascii": 1,
                      "bundle_files": 1,
                      "includes": ["encodings", "encodings.*"],
                      "packages": ["encodings"]}},
zipfile = None,
name    = "Monit",
windows = ['Monit.py'],
)
4

0 回答 0