我父亲正在开发一个程序,除其他外,该程序需要 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'],
)