Giter Site home page Giter Site logo

pystand's Introduction

PyStand

Python 独立部署环境。Python 3.5 以后,Windows 下面都有一个 Embedded Python 的独立 Python 运行环境,这个 PyStand 就是配合 Embedded Python 使用的。

特性介绍

  • 使用 PyStand + PyQt5 精简版发布 PyQt 程序,打包大小只有 14MB。
  • 使用 PyStand 发布普通 Python 程序,打包大小仅 5MB。

功能说明

  • Windows 下独立 Python 环境的启动器。
  • 自动加载 PyStand.exe 同级目录下面 runtime 子目录内的 Embedded Python。
  • 自动启动 PyStand.exe 同级目录下面的 PyStand.int 程序(Python 代码)。
  • 如果改名,会加载对应名称的 .int 文件,比如改为 MyDemo.exe 就会加载 MyDemo.int
  • 窗口程序,无 Console,但是如果在 cmd.exe 内运行,可以看到 print 的内容。
  • 会自动添加 PyStand.exe 同级目录下的 site-packages 目录,库可以放到里面。

使用方式

  • 用 CMake 生成 PyStand.exe (或者到 Release 里下个现成的)。
  • 下载 Python Embedded 版本,放到 PyStand.exe 所在目录的 runtime 子目录内。
  • 注意 Python Embedded 如果是 32 位,PyStand 配置 CMake 时也需要指明 -A Win32
  • PyStand.exe 所在目录创建 Python 源代码 PyStand.int。
  • 双击 PyStand.exe 就会运行 PyStand.int 里的代码。
  • 可以编译成命令行版方便调试,CMake 的时候加 -DPYSTAND_CONSOLE=ON 即可。

常见问题

安装依赖

用一个同 Embedded Python 相同版本的 Python 做一个 venv,然后 pip 独立安装好模块后将 site-packages 内对应的包复制到 PyStand.exesite-packages 下直接使用。

查看错误

如果在 cmd.exe 内部运行 PyStand.exe 可以看到标准输出和标准错误。不过推荐的做法是 PyStand.int 里尽量精简,比如:

import main
main.main()

把你的主程序写到 main.py 里面,用你常规方式把程序调试通顺了,然后再在 PyStand.intimport 一下即可,实在 PyStand.int 有错误,再到命令行下面去运行 PyStand.exe 查看错误。

MessageBox

PyStand 添加了一个 os.MessageBox(msg, title) 的接口,可以用来简单显示个对话框。

更换图标

可以替换 appicon.ico 文件并重新编译 PyStand.exe ,或者使用 Resource Hacker 直接 替换 Release 内下载的 PyStand.exe 文件的程序图标。

脚本组织

可以在 PyStand.exe 同级目录新建一个 script 文件夹,将脚本放进去,PyStand.int 里面就是添加一下 sys.path 然后 import 即可。

发布打包时将 script 文件夹用 zip 压缩成 script.egg 文件,PyStand.int 里检测到该文件存在就加入到 sys.path,然后再 import。

使用例子

这个回答里我说了详细的用法以及 PyInstaller 的优缺点:

更多的用法可以见 Release 下面的例子。

常见问题

其他用户使用中碰到什么疑问?如何解决的?

碰到疑问不妨快速过一下。

pystand's People

Contributors

myd7349 avatar skywind3000 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pystand's Issues

如何压缩 site-packages

site-packages会得到一个很高的压缩率,通常能大幅度减少体积,甚至官方Windows embeddable package包中,标准库就是一个Zip压缩文件,通过.pth引入,请问Pystand如何压缩site-packages,或者有无关于官方库zipapp的最佳实践,期待您的回复。

生成的.egg放在PyStand-py38-pyqt5文件下了,也添加了路径,删除python的script文件,报错如何更改?

源文件拷贝到script文件中没有问题。生成egg文件有问题了。
setup.py脚本

from setuptools import setup, find_packages

setup(
    name="script",
    version="0.1",
    packages=find_packages()
)

生成的文件名为script-0.1-py3.8.egg,拷贝到PyStand-py38-pyqt5中,显示

D:\aaa\PyStand-py38-pyqt5>Traceback (most recent call last):
  File "<string>", line 29, in <module>
  File "<string>", line 5, in <module>
ModuleNotFoundError: No module named 'main'

PyQt5 QtWidgets.QFileDialog.getOpenFileName 卡死或程序闪退

使用PyQt5, 主窗体调用子窗体时,子窗体上有个按钮,点击会打开选择文件的对话框,QtWidgets.QFileDialog.getOpenFileName在embedable Python环境运行,子窗体弹出正常,但程序在运行到getOpenFileName(self, 'title',path)时会卡死,程序无响应,即使在powershell中运行PyStand.exe也看不到报错信息。而在常规的Python环境中,运行OK,对话框正常弹出,可选择文件。
怀疑是缺少了哪个库,或者哪个库安装异常?之前发现embed Python没有tkinter,后来把文件拷贝进去了。这里请教下pywin32模块如何安装到embedable Python环境,直接从虚拟环境中site-packages拷贝到到embed 的site-packages就可以吗?

命令行中无法使用input

F:\SMALL\PyStand-py38>Hello from F:\SMALL\PyStand-py38\PyStand.int

Traceback (most recent call last):
File "", line 34, in
File "F:\SMALL\PyStand-py38\PyStand.int", line 10, in
filename = input("请输入EXCEL文件名(带后缀,EXCEL文件放在本文件同目录)")
RuntimeError: input(): lost sys.stdin

运行报错太长时的显示问题

我在cmd中运行PyStand.exe, 运行中的报错在显示在弹窗里. 因为报错太长, 而且error弹窗不支持滚动或调整窗口大小, 导致我无法看到完整的error信息.
bug while error is too long

一个相反的Python启动方式

大佬的这个方案很好,目前在很多项目中使用,之前发给别人代码的同时还得带着一个安装文档。。。

目前这个方案其实就是自带环境,用自己的启动器,但是如果一个电脑上如果有多个程式,全部用这个方案就会带多个环境,就有点election味道了,所以,能不能给原来的默认Python也加个启动器呢

我目前做了个,一个启动器exe,一个配置文件,按照int格式,里面备注了Python.exe路径,和启动入口文件,然后启动器.exe启动对应py脚本

老板是否愿意搞一个呢

加入numpy包的时候出现错误

请教一下,在site-packages中加入numpy时,出现如下错误,好像是路径的问题,但是在环境中调试时是正常的
image

由于 Exception.ToString() 失败,因此无法打印异常字符串。

将一个PyQt 5的项目添加到了script 文件夹下,在PyStand.int 中引入,然后在terminal中启动PyStand.exe. 跟句错误提示,缺什么就从Python环境的site-package 中拷贝对应的库到PyStand 的site-package 。前面几个库放进去就好了,然后遇到了这个错误,请问怎么解决啊,怎么能看到是哪里引发的错误

PS D:\PyBuild\pystand>.\PyStand.exe
由于 Exception.ToString() 失败,因此无法打印异常字符串。

Python: 3.6.2 32 bit
PyStand: 32 bit

多进程报错

根据#21@myd7349提供的方法,可以解决不会N个进程弹出N个GUI了。
但是当子进程结束任务时,就会N个(pool数)下列错误,当确定后,主进程继续往下走。
image

多进程采用的进程池pool.apply_async的方式。

如果采用bat调用runtime\python.exe方式启动没有任何错误,采用pystand.exe方式启动就会有上述错误。

经过检查,子进程退出时将会跳转到muitlprocessing\spawn.py::spawn_main中执行sys.exit,从而引发截图Error。

========================
以下脚本将复现sys.exit(0)引起的Error:

import sys
import os


text = '''
import sys
sys.exit(0)
'''

PYSTAND_SCRIPT = '123.int'


def MessageBox(msg, info = 'Message'):
    import ctypes
    ctypes.windll.user32.MessageBoxW(None, str(msg), str(info), 0)
    return 0
os.MessageBox = MessageBox

#ifndef PYSTAND_CONSOLE
try:
    fd = os.open('CONOUT$', os.O_RDWR | os.O_BINARY)
    fp = os.fdopen(fd, 'w')
    sys.stdout = fp
    sys.stderr = fp
except Exception:
    fp = open(os.devnull, 'w')
    sys.stdout = fp
    sys.stderr = fp



environ = {'__file__': PYSTAND_SCRIPT, '__name__': '__main__'}
environ['__package__'] = None

#ifndef PYSTAND_CONSOLE
try:
    code = compile(text, PYSTAND_SCRIPT, 'exec')
    exec(code, environ)
except:
    import traceback, io
    sio = io.StringIO()
    traceback.print_exc(file = sio)
    os.MessageBox(sio.getvalue(), 'Error')

#else
code = compile(text, PYSTAND_SCRIPT, 'exec')
exec(code, environ)

查阅资料,sys.exit(0)会被捕捉,推荐使用os._exit(0),但在本例中就需要修改py自带的multiprocessing包了,不是太好。

导入ddddocr报错

系统 win10 LTSC
ddddocr版本 1.4.8
onnxruntime版本 1.15.1
我把所有的包全都复制到了site-packages下,运行时就会报错
image
onnxruntime文件夹下有onnxruntime_pybind11_state.pyd这个文件,看起来好像是应用程序找不到或处理不了这个文件,请问大佬应该怎么解决

onnxruntime

├─capi
│ │ onnxruntime_collect_build_info.py
│ │ onnxruntime_inference_collection.py
│ │ onnxruntime_providers_shared.dll
│ │ onnxruntime_pybind11_state.pyd
│ │ onnxruntime_validation.py
│ │ version_info.py
│ │ _ld_preload.py
│ │ _pybind_state.py
│ │ init.py
│ │
│ └─training

numpy导入问题补录

之前在导入numpy出现问题时出现如下问题
image
需要检查一下原因:python小更新版本,之前出现问题是由于python是3.10.5,而下载的python embed版本是3.10.xx(忘了是多少了,但是不是0.5),必须版本严格一致。
还有anaconda中packages也有可能出现问题。

能否自定义runtime的路径?

产生如此的需求是因为服务部署程序需要根据不同的配置内容(比如端口)多开,这样其实runtime、主脚本是完全一致的。而主脚本依赖的配置文件路径也是相同的(脚本同目录下某文件)。

比如
env
--runtime
--site
--app1
----pystand.exe
----setting.json
--app2
----pystand.exe
----setting.json

在控制台下可以正常运行,桌面直接运行没有反应

大神好,我用的是64位pystand,以及64位的python3.9.13,完整的pyqt5,在终端运行没有提示任何错误,完美运行,在桌面直接双击图标却没有任何反应,这种问题大概是出在哪里呢?谢谢!pystand真的很好用!

程序路径不能包含中文

感谢作者分享这个方便的打包工具,我用来给非技术同事写一些方便的小工具。
但使用过程中遇到一点问题,PyStand.exe的路径中不能包含中文(我知道只要换成纯英文路径就行了,但实在是被问多了😂),请教下有什么办法能解决这个问题么?
微信截图_20220227163537

subprocess 执行会弹控制台

PyStand.int添加如下代码,会弹控制台, 有没有大佬知道怎么不弹控制台

import sys, os
os.chdir(os.path.dirname(__file__))
sys.path.append(os.path.abspath('script'))
import subprocess
def runcmd(command):
    while 1:
        ret = subprocess.run(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8",timeout=3)
        if ret.returncode == 0:
            print("success:",ret)
        else:
            print("error:",ret)
            
runcmd(["ping","www.baidu.com"]) 

image

如何支持多进程调用python

由于项目需要在程序中需要另起一个进程调用python:

# PyStand.int
import sys
sys.path.append("./script")

from subprocess import run
# run('python ./script/demo.py')  无法找到python
run('./runtime/python ./script/demo.py')

但这样会导致无法导入site-packages中的库。仔细想来,这也正是PyStand源码的意义所在。

那么如果有这种需求,该如何实现呢,烦请不吝赐教,谢谢!!

请问如何支持多进程

目前会报错:

_pickle.PicklingError: Can't pickle <function x at 0x00000123B688D1B0>: attribute lookup x on __main__ failed

不断的启动新进程->新进程启动->本进程报错退出

例子:

#  vim: set ts=4 sw=4 tw=0 et ft=python :
import os
import sys
import multiprocessing as mp
from time import sleep


def foo(q):
    for _ in range(8):
        sleep(1)
        q.put('hello')


if __name__ == '__main__':
    mp.freeze_support()

    msg = 'Hello from %s'%(os.path.abspath(__file__))
    print(msg)
    print()

    for path in sys.path:
        print('>', path)

    q = mp.Queue()
    p = mp.Process(target=foo, args=(q,))
    p.start()
    for i in range(8):
        sleep(1.1)
        print(q.get())
    p.join()

    a = input('just put something')

Qt5 中文路径处理问题

在使用 Pystand 打包后,如果目录中出现中文,会出现无法加载插件的情况,如下:
image

这应该不是 Qt 的问题,在不打包的情况下,是能够正常启动,或者,可以通过将 \lib\PyQt5\Qt5\plugins 中的 \platforms 文件夹移动到 exe 的平级目录中,那么此时在中文路径下也没问题了。请问如何修复该问题。

关于目录结构的一些小建议

你好,目前的readme里面提到的结构是runtime,site-packages 文件夹,看了下代码实际site-packages可以改为lib的,runtime能不能也支持多个命名,比如 增加 bin,在做的项目里面规则是bin,lib目录,主要是方便不熟悉Python的其他朋友了解目录是干啥的,自己改了下编译了一个,老板看要不要更新下呢

能否增加一个编译选项, 开启后加载指定文件名的int文件

现在exe启动时会加载同名的int文件, 如果修改exe文件的文件名的话也要同时修改int文件的文件名, 能否增加一个选项, 开启后固定加载指定文件名的int文件, 那样的话int文件名只需最初设置一次, 之后修改exe文件名就无需修改int文件的文件名了

Py_Main的部分行为和python -c 的不一致

用PyStand.exe启动一个统计目录里文件个数的程序,发现和直接python启动的运行结果不一致。
和Windows命令行的也不一致,在3.8.10和3.9.10均发现了这个问题。与命令行参数-I -s -S无关,纯粹就是Py_Main方法的问题。
Py_Main会直接忽略掉某些名字过长的文件,导致开发时候的运行结果和打包以后不一样,定位了好久。不知道还有没有别的地方有这种问题,打包方式可能又得换回pyinstaller了。
image
image
import pathlib
s = pathlib.Path().rglob("*")
s = filter(lambda f:f.is_file(), s)
s = list(s)
print(len(s))

Python3.9打包easyocr极其依赖后运行出错。

林爷您好,请教一个问题,我打包一个依赖easyocr的脚本后运行出错:
Python 3.9.9 (tags/v3.9.9:ccb0e6a, Nov 15 2021, 18:08:50) [MSC v.1929 64 bit (AMD64)] on win32

image

image

image

我没使用您默认提供的3.8版本,是因为这个版本pip安装easyocr的时候会报依赖混乱的错误。操作系统是win10。
似乎在这个环境下,所有pyd格式的包都没法引入进来。用您提供的python3.8版本可以正常使用lxml,但是用我下载的3.9.9 embedded版本就不行,也会报类似的引包错误。

求指点。

PyStand使用经验分享

首先感谢韦神,带来了这个非常优秀的工具。

我使用了PyStand一段时间,参考过本项目issues及韦神等大佬的文章,积累了一点点相关的经验。比如如何自定义启动脚本的路径,一键编译,如何从0开始搭建和管理Python环境, 如何用VS Code调试代码(支持断点和第三方库的语法补全),及pyqt、qml的中文路径问题等。也根据自己的需求修改过原项目代码。

本项目README和WiKi相对没那么丰富,所以我整理了一下自己的经验,写在 我的fork的README 里。也许可以给小白或者有需要的人提供一些参考,让不熟悉C++的人也可以一定程度上编译项目和自定义Python环境,及通过VS Code调试的方案。希望能为PyStand生态提供一点资料。

使用PyStand的项目示例: Umi-OCR

示例程序在win7上无法运行

我下载了示例程序(32位),在两台win7 x86 和 x64 实机运行Pystand.exe后,没有任何反应,命令行也没有任何输出。把pystand.int文件删除可以正常报错。

将runtime换成python3.10版本无法运行

大佬,我下载的PyStand-py38-pyqt5,直接点击可以运行,但是将runtime换成python-3.10.11-embed-win32,报错,
屏幕截图 2023-12-01 172942
是不可以换成其他版本么?但是我的程序只能在3.10版本运行,麻烦大神了!

【求助】单独运行PyStand.exe时闪退

韦神您好,

感谢您提供的PyStand,真的很喜欢。但是最近遇到了一些问题,无法解决,还望帮忙看看。

我目前的平台是windows x64+PyStand x64,用命令行运行没有问题,也没有错误提示。但是在双击直接运行PyStand.exe的时候会发生闪退(也即会闪出一个命令行的窗口,然后立即消失)。

经过定位,发现是由于
from paddlespeech.cli.asr.infer import ASRExecutor
这句话导致的。如果把这句话注释掉则没有问题可以执行。

后来我把这句话放到了您给的示例文件中,也是一样的效果,同样会发生闪退。

由于没有任何错误信息出现,所以也没有办法排查到底是哪里的问题,还希望韦神和其他大佬看到后能够帮我分析一下。

谢谢!

如何实现打开直接在Console中

如题,在不使用窗体的情况下,如何做到不从CMD或其他Ter入口打开。而是双击直接打开exe就在终端中显示,很多内部工具都是在终端下实现的简单Gui界面。

win7无法启动python的一些经验、报错展示

例图:

弹窗

测试系统:win7 x64 旗舰 sp1 7601 纯净版
python版本:3.8.10 32位

如果运行PyStand,或者直接运行python解释器时,出现了这些错误:

无法启动此程序,因为计算机中丢失api-ms-win-crt-conio-l1-1-0.dll 。尝试重新安装该程序以解决此问题。

应用程序无法正常启动(0xc000007b)。请单击确定”关闭应用程序。

Cannot find Py_Main() in: ……/python3.dll

大概率是缺乏VC运行库导致。

下载安装VC运行库即可解决。
https://aka.ms/vs/17/release/vc_redist.x64.exe

import sounddevice 报错

韦神 @skywind3000
你好,从知乎看到你的文章找到这里的。我尝试使用这个工程开发一个音频GUI程序,使用的是 20220313 - v1.0.6 PyStand-py38-pyqt5-lite.7z 这个基础开发包。
我需要在程序中 使用 https://github.com/spatialaudio/python-sounddevice python 包,我按照你知乎上的介绍:
1. 创建了python3.8 (Python 3.8.10) 的虚拟环境,原始site-packages 目录如下:
image
2. 在虚拟环境下使用 pip install sounddevice -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 安装 sounddevice, 安装过程如下:

   Looking in indexes: http://pypi.douban.com/simple
Collecting sounddevice
  Downloading http://pypi.doubanio.com/packages/05/8d/78e03fae1d3735d714a8a3d8fb8241bf982fd810a56c7aff7edd6bcba533/sounddevice-0.4.5-py3-none-win_amd64.whl (195 kB)
     |████████████████████████████████| 195 kB 2.2 MB/s
Collecting CFFI>=1.0
  Downloading http://pypi.doubanio.com/packages/c9/e3/0a52838832408cfbbf3a59cb19bcd17e64eb33795c9710ca7d29ae10b5b7/cffi-1.15.1-cp38-cp38-win_amd64.whl (178 kB)
     |████████████████████████████████| 178 kB 6.8 MB/s
Collecting pycparser
  Downloading http://pypi.doubanio.com/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl (118 kB)
     |████████████████████████████████| 118 kB ...
Installing collected packages: pycparser, CFFI, sounddevice
Successfully installed CFFI-1.15.1 pycparser-2.21 sounddevice-0.4.5
WARNING: You are using pip version 21.1.1; however, version 22.3.1 is available.
You should consider upgrading via the 'c:\users\yangjie\desktop\pystand\test2\scripts\python.exe -m pip install --upgrade pip' command.
  1. 安装 sounddevice 后的site-packages 目录如下:
    image
  2. 我把新增的 _sounddevice_data,cffi,pycparser ,_cffi_backend.cp38-win_amd64.pyd,_sounddevice.py 和 sounddevice.py 拷贝到 PyStand的目录如下:
    image
  3. 然后再PyStand.int 中 import sounddevice 报如下错误:
    image
  4. 我尝试把 _cffi_backend.cp38-win_amd64.pyd 重新命名 _cffi_backend.pyd ,还是报如下错误:
    image
  5. 报错的 _sounddevice.py 内容如下:
# auto-generated file
import _cffi_backend

ffi = _cffi_backend.FFI('_sounddevice',
    _version = 0x2601,
    _types = b'\x00\x00\x20\x0D\x00\x00\x90\x03\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x7E\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x81\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x23\x0D\x00\x00\x94\x03\x00\x00\x00\x0F\x00\x00\x83\x0D\x00\x00\x00\x0F\x00\x00\x88\x0D\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x01\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x00\x0F\x00\x00\x28\x0D\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x7C\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x01\x0B\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x8A\x03\x00\x00\x26\x11\x00\x00\x0E\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x0A\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x0B\x03\x00\x00\x26\x11\x00\x00\x26\x11\x00\x00\x0E\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x59\x03\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x35\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x0E\x01\x00\x00\x0A\x01\x00\x00\x3B\x11\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x0B\x11\x00\x00\x0B\x11\x00\x00\x0A\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x0B\x11\x00\x00\x94\x03\x00\x00\x0A\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x0B\x11\x00\x00\x72\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x52\x11\x00\x00\x0B\x11\x00\x00\x0A\x01\x00\x00\x87\x03\x00\x00\x0A\x01\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x00\x0F\x00\x00\x70\x0D\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x94\x0D\x00\x00\x85\x03\x00\x00\x92\x03\x00\x00\x0A\x01\x00\x00\x00\x0F\x00\x00\x94\x0D\x00\x00\x67\x11\x00\x00\x0A\x01\x00\x00\x00\x0F\x00\x00\x94\x0D\x00\x00\x09\x01\x00\x00\x00\x0F\x00\x00\x94\x0D\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x94\x0D\x00\x00\x0B\x11\x00\x00\x09\x01\x00\x00\x0B\x11\x00\x00\x09\x01\x00\x00\x0B\x11\x00\x00\x00\x0F\x00\x00\x09\x09\x00\x00\x01\x09\x00\x00\x7F\x03\x00\x00\x02\x09\x00\x00\x00\x0B\x00\x00\x82\x03\x00\x00\x03\x09\x00\x00\x84\x03\x00\x00\x04\x09\x00\x00\x00\x09\x00\x00\x02\x0B\x00\x00\x05\x09\x00\x00\x89\x03\x00\x00\x06\x09\x00\x00\x07\x09\x00\x00\x03\x0B\x00\x00\x04\x0B\x00\x00\x08\x09\x00\x00\x05\x0B\x00\x00\x06\x0B\x00\x00\x02\x01\x00\x00\x05\x03\x00\x00\x15\x01\x00\x00\x75\x03\x00\x00\x00\x01',
    _globals = (b'\x00\x00\x15\x23PaMacCore_GetChannelName',0,b'\x00\x00\x66\x23PaMacCore_SetupChannelMap',0,b'\x00\x00\x6B\x23PaMacCore_SetupStreamInfo',0,b'\x00\x00\x2A\x23PaWasapi_IsLoopback',0,b'\x00\x00\x48\x23Pa_AbortStream',0,b'\x00\x00\x48\x23Pa_CloseStream',0,b'\x00\x00\x61\x23Pa_GetDefaultHostApi',0,b'\x00\x00\x61\x23Pa_GetDefaultInputDevice',0,b'\x00\x00\x61\x23Pa_GetDefaultOutputDevice',0,b'\x00\x00\x61\x23Pa_GetDeviceCount',0,b'\x00\x00\x04\x23Pa_GetDeviceInfo',0,b'\x00\x00\x12\x23Pa_GetErrorText',0,b'\x00\x00\x61\x23Pa_GetHostApiCount',0,b'\x00\x00\x07\x23Pa_GetHostApiInfo',0,b'\x00\x00\x0D\x23Pa_GetLastHostErrorInfo',0,b'\x00\x00\x31\x23Pa_GetSampleSize',0,b'\x00\x00\x1C\x23Pa_GetStreamCpuLoad',0,b'\x00\x00\x0A\x23Pa_GetStreamHostApiType',0,b'\x00\x00\x0F\x23Pa_GetStreamInfo',0,b'\x00\x00\x63\x23Pa_GetStreamReadAvailable',0,b'\x00\x00\x1C\x23Pa_GetStreamTime',0,b'\x00\x00\x63\x23Pa_GetStreamWriteAvailable',0,b'\x00\x00\x61\x23Pa_GetVersion',0,b'\x00\x00\x1A\x23Pa_GetVersionText',0,b'\x00\x00\x2D\x23Pa_HostApiDeviceIndexToDeviceIndex',0,b'\x00\x00\x22\x23Pa_HostApiTypeIdToHostApiIndex',0,b'\x00\x00\x61\x23Pa_Initialize',0,b'\x00\x00\x25\x23Pa_IsFormatSupported',0,b'\x00\x00\x48\x23Pa_IsStreamActive',0,b'\x00\x00\x48\x23Pa_IsStreamStopped',0,b'\x00\x00\x3E\x23Pa_OpenDefaultStream',0,b'\x00\x00\x34\x23Pa_OpenStream',0,b'\x00\x00\x4B\x23Pa_ReadStream',0,b'\x00\x00\x55\x23Pa_SetStreamFinishedCallback',0,b'\x00\x00\x6F\x23Pa_Sleep',0,b'\x00\x00\x48\x23Pa_StartStream',0,b'\x00\x00\x48\x23Pa_StopStream',0,b'\x00\x00\x61\x23Pa_Terminate',0,b'\x00\x00\x50\x23Pa_WriteStream',0,b'\x00\x00\x20\x21__stderrp',0,b'\xFF\xFF\xFF\x0BeAudioCategoryAlerts',4,b'\xFF\xFF\xFF\x0BeAudioCategoryCommunications',3,b'\xFF\xFF\xFF\x0BeAudioCategoryGameChat',8,b'\xFF\xFF\xFF\x0BeAudioCategoryGameEffects',6,b'\xFF\xFF\xFF\x0BeAudioCategoryGameMedia',7,b'\xFF\xFF\xFF\x0BeAudioCategoryMedia',11,b'\xFF\xFF\xFF\x0BeAudioCategoryMovie',10,b'\xFF\xFF\xFF\x0BeAudioCategoryOther',0,b'\xFF\xFF\xFF\x0BeAudioCategorySoundEffects',5,b'\xFF\xFF\xFF\x0BeAudioCategorySpeech',9,b'\xFF\xFF\xFF\x0BeStreamOptionMatchFormat',2,b'\xFF\xFF\xFF\x0BeStreamOptionNone',0,b'\xFF\xFF\xFF\x0BeStreamOptionRaw',1,b'\xFF\xFF\xFF\x0BeThreadPriorityAudio',1,b'\xFF\xFF\xFF\x0BeThreadPriorityCapture',2,b'\xFF\xFF\xFF\x0BeThreadPriorityDistribution',3,b'\xFF\xFF\xFF\x0BeThreadPriorityGames',4,b'\xFF\xFF\xFF\x0BeThreadPriorityNone',0,b'\xFF\xFF\xFF\x0BeThreadPriorityPlayback',5,b'\xFF\xFF\xFF\x0BeThreadPriorityProAudio',6,b'\xFF\xFF\xFF\x0BeThreadPriorityWindowManager',7,b'\x00\x00\x1F\x23fclose',0,b'\x00\x00\x00\x23fopen',0,b'\xFF\xFF\xFF\x0BpaAL',9,b'\xFF\xFF\xFF\x0BpaALSA',8,b'\xFF\xFF\xFF\x0BpaASIO',3,b'\xFF\xFF\xFF\x0BpaAbort',2,b'\xFF\xFF\xFF\x1FpaAsioUseChannelSelectors',1,b'\xFF\xFF\xFF\x0BpaAudioScienceHPI',14,b'\xFF\xFF\xFF\x0BpaBadBufferPtr',-9972,b'\xFF\xFF\xFF\x0BpaBadIODeviceCombination',-9993,b'\xFF\xFF\xFF\x0BpaBadStreamPtr',-9988,b'\xFF\xFF\xFF\x0BpaBeOS',10,b'\xFF\xFF\xFF\x0BpaBufferTooBig',-9991,b'\xFF\xFF\xFF\x0BpaBufferTooSmall',-9990,b'\xFF\xFF\xFF\x0BpaCanNotReadFromACallbackStream',-9977,b'\xFF\xFF\xFF\x0BpaCanNotReadFromAnOutputOnlyStream',-9975,b'\xFF\xFF\xFF\x0BpaCanNotWriteToACallbackStream',-9976,b'\xFF\xFF\xFF\x0BpaCanNotWriteToAnInputOnlyStream',-9974,b'\xFF\xFF\xFF\x1FpaClipOff',1,b'\xFF\xFF\xFF\x0BpaComplete',1,b'\xFF\xFF\xFF\x0BpaContinue',0,b'\xFF\xFF\xFF\x0BpaCoreAudio',5,b'\xFF\xFF\xFF\x1FpaCustomFormat',65536,b'\xFF\xFF\xFF\x0BpaDeviceUnavailable',-9985,b'\xFF\xFF\xFF\x0BpaDirectSound',1,b'\xFF\xFF\xFF\x1FpaDitherOff',2,b'\xFF\xFF\xFF\x1FpaFloat32',1,b'\xFF\xFF\xFF\x1FpaFormatIsSupported',0,b'\xFF\xFF\xFF\x1FpaFramesPerBufferUnspecified',0,b'\xFF\xFF\xFF\x0BpaHostApiNotFound',-9979,b'\xFF\xFF\xFF\x0BpaInDevelopment',0,b'\xFF\xFF\xFF\x0BpaIncompatibleHostApiSpecificStreamInfo',-9984,b'\xFF\xFF\xFF\x0BpaIncompatibleStreamHostApi',-9973,b'\xFF\xFF\xFF\x1FpaInputOverflow',2,b'\xFF\xFF\xFF\x0BpaInputOverflowed',-9981,b'\xFF\xFF\xFF\x1FpaInputUnderflow',1,b'\xFF\xFF\xFF\x0BpaInsufficientMemory',-9992,b'\xFF\xFF\xFF\x1FpaInt16',8,b'\xFF\xFF\xFF\x1FpaInt24',4,b'\xFF\xFF\xFF\x1FpaInt32',2,b'\xFF\xFF\xFF\x1FpaInt8',16,b'\xFF\xFF\xFF\x0BpaInternalError',-9986,b'\xFF\xFF\xFF\x0BpaInvalidChannelCount',-9998,b'\xFF\xFF\xFF\x0BpaInvalidDevice',-9996,b'\xFF\xFF\xFF\x0BpaInvalidFlag',-9995,b'\xFF\xFF\xFF\x0BpaInvalidHostApi',-9978,b'\xFF\xFF\xFF\x0BpaInvalidSampleRate',-9997,b'\xFF\xFF\xFF\x0BpaJACK',12,b'\xFF\xFF\xFF\x0BpaMME',2,b'\xFF\xFF\xFF\x1FpaMacCoreChangeDeviceParameters',1,b'\xFF\xFF\xFF\x1FpaMacCoreConversionQualityHigh',1024,b'\xFF\xFF\xFF\x1FpaMacCoreConversionQualityLow',768,b'\xFF\xFF\xFF\x1FpaMacCoreConversionQualityMax',0,b'\xFF\xFF\xFF\x1FpaMacCoreConversionQualityMedium',512,b'\xFF\xFF\xFF\x1FpaMacCoreConversionQualityMin',256,b'\xFF\xFF\xFF\x1FpaMacCoreFailIfConversionRequired',2,b'\xFF\xFF\xFF\x1FpaMacCoreMinimizeCPU',257,b'\xFF\xFF\xFF\x1FpaMacCoreMinimizeCPUButPlayNice',256,b'\xFF\xFF\xFF\x1FpaMacCorePlayNice',0,b'\xFF\xFF\xFF\x1FpaMacCorePro',1,b'\xFF\xFF\xFF\x1FpaNeverDropInput',4,b'\xFF\xFF\xFF\x1FpaNoDevice',-1,b'\xFF\xFF\xFF\x0BpaNoError',0,b'\xFF\xFF\xFF\x1FpaNoFlag',0,b'\xFF\xFF\xFF\x1FpaNonInterleaved',2147483648,b'\xFF\xFF\xFF\x0BpaNotInitialized',-10000,b'\xFF\xFF\xFF\x0BpaNullCallback',-9989,b'\xFF\xFF\xFF\x0BpaOSS',7,b'\xFF\xFF\xFF\x1FpaOutputOverflow',8,b'\xFF\xFF\xFF\x1FpaOutputUnderflow',4,b'\xFF\xFF\xFF\x0BpaOutputUnderflowed',-9980,b'\xFF\xFF\xFF\x1FpaPlatformSpecificFlags',4294901760,b'\xFF\xFF\xFF\x1FpaPrimeOutputBuffersUsingStreamCallback',8,b'\xFF\xFF\xFF\x1FpaPrimingOutput',16,b'\xFF\xFF\xFF\x0BpaSampleFormatNotSupported',-9994,b'\xFF\xFF\xFF\x0BpaSoundManager',4,b'\xFF\xFF\xFF\x0BpaStreamIsNotStopped',-9982,b'\xFF\xFF\xFF\x0BpaStreamIsStopped',-9983,b'\xFF\xFF\xFF\x0BpaTimedOut',-9987,b'\xFF\xFF\xFF\x1FpaUInt8',32,b'\xFF\xFF\xFF\x0BpaUnanticipatedHostError',-9999,b'\xFF\xFF\xFF\x1FpaUseHostApiSpecificDeviceSpecification',-2,b'\xFF\xFF\xFF\x0BpaWASAPI',13,b'\xFF\xFF\xFF\x0BpaWDMKS',11,b'\xFF\xFF\xFF\x0BpaWinWasapiExclusive',1,b'\xFF\xFF\xFF\x0BpaWinWasapiPolling',8,b'\xFF\xFF\xFF\x0BpaWinWasapiRedirectHostProcessor',2,b'\xFF\xFF\xFF\x0BpaWinWasapiThreadPriority',16,b'\xFF\xFF\xFF\x0BpaWinWasapiUseChannelMask',4,b'\x00\x00\x20\x21stderr',0),
    _struct_unions = ((b'\x00\x00\x00\x85\x00\x00\x00\x02$PaMacCoreStreamInfo',b'\x00\x00\x32\x11size',b'\x00\x00\x23\x11hostApiType',b'\x00\x00\x32\x11version',b'\x00\x00\x32\x11flags',b'\x00\x00\x68\x11channelMap',b'\x00\x00\x32\x11channelMapSize'),(b'\x00\x00\x00\x7D\x00\x00\x00\x02PaAsioStreamInfo',b'\x00\x00\x32\x11size',b'\x00\x00\x23\x11hostApiType',b'\x00\x00\x32\x11version',b'\x00\x00\x32\x11flags',b'\x00\x00\x91\x11channelSelectors'),(b'\x00\x00\x00\x7F\x00\x00\x00\x02PaDeviceInfo',b'\x00\x00\x05\x11structVersion',b'\x00\x00\x01\x11name',b'\x00\x00\x05\x11hostApi',b'\x00\x00\x05\x11maxInputChannels',b'\x00\x00\x05\x11maxOutputChannels',b'\x00\x00\x28\x11defaultLowInputLatency',b'\x00\x00\x28\x11defaultLowOutputLatency',b'\x00\x00\x28\x11defaultHighInputLatency',b'\x00\x00\x28\x11defaultHighOutputLatency',b'\x00\x00\x28\x11defaultSampleRate'),(b'\x00\x00\x00\x82\x00\x00\x00\x02PaHostApiInfo',b'\x00\x00\x05\x11structVersion',b'\x00\x00\x23\x11type',b'\x00\x00\x01\x11name',b'\x00\x00\x05\x11deviceCount',b'\x00\x00\x05\x11defaultInputDevice',b'\x00\x00\x05\x11defaultOutputDevice'),(b'\x00\x00\x00\x84\x00\x00\x00\x02PaHostErrorInfo',b'\x00\x00\x23\x11hostApiType',b'\x00\x00\x70\x11errorCode',b'\x00\x00\x01\x11errorText'),(b'\x00\x00\x00\x87\x00\x00\x00\x02PaStreamCallbackTimeInfo',b'\x00\x00\x28\x11inputBufferAdcTime',b'\x00\x00\x28\x11currentTime',b'\x00\x00\x28\x11outputBufferDacTime'),(b'\x00\x00\x00\x89\x00\x00\x00\x02PaStreamInfo',b'\x00\x00\x05\x11structVersion',b'\x00\x00\x28\x11inputLatency',b'\x00\x00\x28\x11outputLatency',b'\x00\x00\x28\x11sampleRate'),(b'\x00\x00\x00\x8A\x00\x00\x00\x02PaStreamParameters',b'\x00\x00\x05\x11device',b'\x00\x00\x05\x11channelCount',b'\x00\x00\x32\x11sampleFormat',b'\x00\x00\x28\x11suggestedLatency',b'\x00\x00\x0B\x11hostApiSpecificStreamInfo'),(b'\x00\x00\x00\x8D\x00\x00\x00\x02PaWasapiStreamInfo',b'\x00\x00\x32\x11size',b'\x00\x00\x23\x11hostApiType',b'\x00\x00\x32\x11version',b'\x00\x00\x32\x11flags',b'\x00\x00\x32\x11channelMask',b'\x00\x00\x93\x11hostProcessorOutput',b'\x00\x00\x93\x11hostProcessorInput',b'\x00\x00\x8F\x11threadPriority',b'\x00\x00\x8C\x11streamCategory',b'\x00\x00\x8E\x11streamOption'),(b'\x00\x00\x00\x7C\x00\x00\x00\x10_IO_FILE',)),
    _enums = (b'\x00\x00\x00\x80\x00\x00\x00\x15PaErrorCode\x00paNoError,paNotInitialized,paUnanticipatedHostError,paInvalidChannelCount,paInvalidSampleRate,paInvalidDevice,paInvalidFlag,paSampleFormatNotSupported,paBadIODeviceCombination,paInsufficientMemory,paBufferTooBig,paBufferTooSmall,paNullCallback,paBadStreamPtr,paTimedOut,paInternalError,paDeviceUnavailable,paIncompatibleHostApiSpecificStreamInfo,paStreamIsStopped,paStreamIsNotStopped,paInputOverflowed,paOutputUnderflowed,paHostApiNotFound,paInvalidHostApi,paCanNotReadFromACallbackStream,paCanNotWriteToACallbackStream,paCanNotReadFromAnOutputOnlyStream,paCanNotWriteToAnInputOnlyStream,paIncompatibleStreamHostApi,paBadBufferPtr',b'\x00\x00\x00\x23\x00\x00\x00\x16PaHostApiTypeId\x00paInDevelopment,paDirectSound,paMME,paASIO,paSoundManager,paCoreAudio,paOSS,paALSA,paAL,paBeOS,paWDMKS,paJACK,paWASAPI,paAudioScienceHPI',b'\x00\x00\x00\x86\x00\x00\x00\x16PaStreamCallbackResult\x00paContinue,paComplete,paAbort',b'\x00\x00\x00\x8B\x00\x00\x00\x16PaWasapiFlags\x00paWinWasapiExclusive,paWinWasapiRedirectHostProcessor,paWinWasapiUseChannelMask,paWinWasapiPolling,paWinWasapiThreadPriority',b'\x00\x00\x00\x8C\x00\x00\x00\x16PaWasapiStreamCategory\x00eAudioCategoryOther,eAudioCategoryCommunications,eAudioCategoryAlerts,eAudioCategorySoundEffects,eAudioCategoryGameEffects,eAudioCategoryGameMedia,eAudioCategoryGameChat,eAudioCategorySpeech,eAudioCategoryMovie,eAudioCategoryMedia',b'\x00\x00\x00\x8E\x00\x00\x00\x16PaWasapiStreamOption\x00eStreamOptionNone,eStreamOptionRaw,eStreamOptionMatchFormat',b'\x00\x00\x00\x8F\x00\x00\x00\x16PaWasapiThreadPriority\x00eThreadPriorityNone,eThreadPriorityAudio,eThreadPriorityCapture,eThreadPriorityDistribution,eThreadPriorityGames,eThreadPriorityPlayback,eThreadPriorityProAudio,eThreadPriorityWindowManager'),
    _typenames = (b'\x00\x00\x00\x7CFILE',b'\x00\x00\x00\x7DPaAsioStreamInfo',b'\x00\x00\x00\x05PaDeviceIndex',b'\x00\x00\x00\x7FPaDeviceInfo',b'\x00\x00\x00\x05PaError',b'\x00\x00\x00\x80PaErrorCode',b'\x00\x00\x00\x05PaHostApiIndex',b'\x00\x00\x00\x82PaHostApiInfo',b'\x00\x00\x00\x23PaHostApiTypeId',b'\x00\x00\x00\x84PaHostErrorInfo',b'\x00\x00\x00\x85PaMacCoreStreamInfo',b'\x00\x00\x00\x32PaSampleFormat',b'\x00\x00\x00\x94PaStream',b'\x00\x00\x00\x59PaStreamCallback',b'\x00\x00\x00\x32PaStreamCallbackFlags',b'\x00\x00\x00\x86PaStreamCallbackResult',b'\x00\x00\x00\x87PaStreamCallbackTimeInfo',b'\x00\x00\x00\x72PaStreamFinishedCallback',b'\x00\x00\x00\x32PaStreamFlags',b'\x00\x00\x00\x89PaStreamInfo',b'\x00\x00\x00\x8APaStreamParameters',b'\x00\x00\x00\x28PaTime',b'\x00\x00\x00\x8BPaWasapiFlags',b'\x00\x00\x00\x93PaWasapiHostProcessorCallback',b'\x00\x00\x00\x8CPaWasapiStreamCategory',b'\x00\x00\x00\x8DPaWasapiStreamInfo',b'\x00\x00\x00\x8EPaWasapiStreamOption',b'\x00\x00\x00\x8FPaWasapiThreadPriority',b'\x00\x00\x00\x32PaWinWaveFormatChannelMask',b'\x00\x00\x00\x92SInt32'),
)

麻烦大佬 给一些指导,谢谢!

int文件是否也能直接省略呢?

最近在使用pystand部署程式,发现int其实也不是必须要的嘛,

作者文档里面写的,int文件要尽量简单,我目前也是这样做的,基本就是这样

import main
main.main()

我寻思着,就这2行代码,也占用一个文件,有点多余了,是否可以这样

  1. 默认寻找 pystand.exe同名int文件,
  2. 没有再找_pystand_static.int文件
  3. 都没有的话,直接执行以下代码
import main
main.main()

或者其他类似导入代码

import app
app.run()

运行含有中文的源文件存在问题

创建一个python文件,内容写‘print('视频预览')’,运行报错:
File "", line 26, in
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa2 in position 11: illegal multibyte sequence

将代码使用egg加密后 如何才能正确的读取egg文件内的文件

在我的项目中 打包时候出现了错误 下面这行代码报错:

file = os.path.join("UI","Custom_UI","QToolTip.qss")
with open(file,'r') as f:
    self.setStyleSheet(f.read())

这里的qss文件是一个需要被读取的文件 用来设置UI样式

压缩成egg后 运行报错:

C:\Users\xyj\Desktop\3.0.0-alpha>Traceback (most recent call last):
Traceback (most recent call last):
  File "<string>", line 34, in <module>
  File "C:\Users\xyj\Desktop\3.0.0-alpha\MOS.int", line 13, in <module>
    Run()
  File "C:\Users\xyj\Desktop\3.0.0-alpha\script\Code\MainWindow.py", line 544, in Run
    ui = RunUi()
  File "C:\Users\xyj\Desktop\3.0.0-alpha\script\Code\MainWindow.py", line 58, in __init__
    self.__init__setToolTipDuration()
  File "C:\Users\xyj\Desktop\3.0.0-alpha\script\Code\MainWindow.py", line 498, in __init__setToolTipDuration
    self._toolTip = ToolTip(parent=self)
  File "C:\Users\xyj\Desktop\3.0.0-alpha\script\UI\Custom_UI\QToolTip.py", line 44, in __init__
    self.__setQss()
  File "C:\Users\xyj\Desktop\3.0.0-alpha\script\UI\Custom_UI\QToolTip.py", line 66, in __setQss
    with open(file,'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'UI\\Custom_UI\\QToolTip.qss'

之后我只好更改了代码 将需要被读取的内容改成一个py文件 并且内建一个函数 调用之后 就返回这个文件的内容 虽然这么可以解决这个问题 但是我并不想这么解决 (因为这个方法很不好 而且以后想快速的改这个qss列表 也很麻烦

改正前:
https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_3/tree/b068e9e212fe5cf668a50d4c83523f7510749c5f

改正后:
https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_3/tree/8629cf3f5d694ca0ba9eb55a28e1c94776f8b735

exe格式的壳只支持Windows,有考虑支持MacOS和Linux吗?

这个程序很棒,能否更进一步更新下,实现Desktop桌面全平台兼容?

我看壳程序好像是用c++写的,除了Windows它能直接编译为MacOS和Linux格式的可执行程序吗?
还是需要自己完全重写新的壳程序?具体如何做有没有大致的流程?

pillow需要Library的内容,怎么吧Library添加到PyStand中

将PIL拷贝到PyStand,执行程序后,提示:
from PIL import Image
File "D:\PyStand\site-packages\PIL\Image.py", line 89, in
from . import _imaging as core
ImportError: DLL load failed while importing _imaging: 找不到指定的模块。

研究后发现,原始的虚拟环境中Lib/site-packages/PIL依赖Library/include, 根据教程,把PIL拷贝到PyStand/site-packages,那么Library拷贝到哪儿呢?

有多进程调用时,会重复启动Qt主窗口直到内存耗尽

入口代码如下,开头会先启动一个后台进程。
python 直接执行正常,通过PyStand.exe 启动,就会不断启动Qt窗口,直到内存耗尽为止。
PyInstaller也有类似问题,按照PyInstaller的方案,加上了freeze_support(),但是问题依旧。
是否需要在PyStand.exe的主程序里添加此调用?

if "__main__" == __name__:
    multiprocessing.freeze_support()
    multiprocessing.Process(target=VideoServer.start_server, daemon=True).start()

    logger.info("启动程序")
    app = QApplication(sys.argv)
    app.setStyleSheet(BASE_STYLE_SHEET)
    win = AppWin(sys.argv)
    win.show()
    sys.exit(app.exec())

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.