skywind3000 / PyStand

:rocket: Python Standalone Deploy Environment !!
MIT License
773 stars 86 forks source link

如何支持多进程调用python #18

Closed coolermzb3 closed 2 years ago

coolermzb3 commented 2 years ago

由于项目需要在程序中需要另起一个进程调用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源码的意义所在。

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

skywind3000 commented 2 years ago

demo.py 再 import 其他 site-packages 里的包前,需要:

import site
site.addsitedir(site_packages)

对于 PyStand.int,加载时这一步已经帮你们做了。

或者修改下 python38._pth 文件,把 site-packages 目录添加进去。

coolermzb3 commented 2 years ago

感谢!通过import site的方法成功了!还做了一些实验补充两点:

  1. 由于demo.py也导入了同级目录下的别的py文件,本来找不到,所以也需要把../script添加到python38._pth中,则可以省略所有文件中的sys.path.append("./script")
  2. 在python38._pth中添加../site-packages对于一般如numpy等包是可行的,但pywin32似乎比较特殊,它导入的时候叫做win32gui,但pyd文件在名为win32的文件夹里,所以只修改python38._pth文件依旧无法找到,还是需要在代码中使用site。

总之 十分感谢!

zuowanbushiwo commented 1 year ago

@coolermzb3 你好 我使用pystand 构建 GUI 程序 需要使用numpy,但是我自己做的时候遇到了一些困难,你能指导一下吗? 谢谢!

skywind3000 commented 1 year ago

啥困难?

coolermzb3 commented 1 year ago

@zuowanbushiwo 虽然不知道是啥问题,但我当时用release里自带的PyStand是没法直接把自己安装的numpy文件夹复制进site-packages并导入成功的,究其原因是因为当时PyStand所带的python解释器是32位,而我们通过conda或pip安装的numpy都是64位,然后我简单试了一下不知道怎么安装32位的numpy(好像根本就没有32的?),所以就自己编译了一个64位的PyStand。

不过现在我看sky大大也release了一个64位的PyStand,所以如果是这方面的问题应该可以解决。

zuowanbushiwo commented 1 year ago

感谢两位的回复 不知道怎么裁剪,整体导入体积太大了,我看你的PyQt 目录下基本只有pyd和pyi 文件,但是我install numpy 后目录下还有好多其他文件,感觉和好多文件和运行时没关系。 python 有没有trace 命令,能够跟踪运行时所需要加载的文件。 比如 我 import numpy , 可以帮助显示我加载了哪些文件?这样对于大的python项目还是很多帮助。 谢谢!

coolermzb3 commented 1 year ago

numpy一共61.7MB 好像不能简单裁剪,具体可以看它的init.py文件,它导入的时候把所有的子库都import并检查了一遍,所以不能把用不到的库删掉。能直接删的只有doc和各个子目录下的tests文件,都删了后大概能减少10MB左右。不过它的大头是openblas库占34MB,还有很多零星pyd文件每个几百K。 可能可以深入到各个子库里依次尝试删掉pyd看看有无影响,不过删一个才减几百K,不知道要删到什么时候,我就没有继续尝试了)


唔 可能还可以删掉init.py文件中导入子库的代码再删那些用不到的库 不过我没有尝试过不知道效果如何)

1672888208(1)

skywind3000 commented 1 year ago

你可以写个脚本:

  1. 把文件的:ctime, mtime, atime 全部设置成 10 年前。
  2. 运行两遍程序。
  3. 查看 atime (access time)变成今天的有哪些?你就知道访问过哪些文件了。
zuowanbushiwo commented 1 year ago

感谢