我的机器是Win7 / 10 64位。我创建了一个简单的项目来模拟我现有的项目结构。我只是想创建一个包含所有.py(s)
的可执行文件结构:
folder
|--test.py
|--main.py
|--lib
|--a.py
|--b.py
test.py
from lib.a import a
...
def main(argv):
print('test.py main()')
a('test.py');
proc = subprocess.Popen(
['python','main.py','123','456',
],
shell = True,
)
while True:
time.sleep(0.5)
if __name__ == '__main__':
main(sys.argv)
main.py
from lib.a import a
...
def main(argv):
from lib.b import b
print('main.py main()')
print(argv[1], argv[2])
a('test.py');
b('test.py');
while True:
time.sleep(0.5)
if __name__ == '__main__':
main(sys.argv)
a.py
...
class a (object):
def __init__(self,
fm,
):
print('a()', fm)
sth = {
'ab': ['aaa','bbb'],
'#': [1,2]
}
df = pandas.DataFrame(sth, columns = ['ab', '#'])
print(df)
b.py
...
class b (object):
def __init__(self,
fm,
):
print('b()', fm)
sth = numpy.array([1,2,3])
print(sth)
python test.py
test.py main()
a() test.py
ab #
0 aaa 1
1 bbb 2
main.py main()
123 456
a() main.py
b() main.py
[1 2 3]
使用以下命令,
pyinstaller test.py -F -p "\\lib"
它挂起并且文件大小> 300MB。 任何想法如何使其工作?尺寸问题不太重要。
根据Arty答案更新:
我尝试在Win10 py3.7.7中使用test.py和以下cmd中的更改:
C:\ Users \ XXXX \ AppData \ Local \ Programs \ Python \ Python37 \ Scripts \ pyinstaller.exe --noconfirm --onefile --console --noupx --add-data“ ./main.py;。 /“ --add-data” ./lib/;./lib/“” test.py“
它可以编译,但是dist \ test.exe的运行结果是:
test.py main()
a() test.py
ab #
0 aaa 1
1 bbb 2
test.py main()
a() test.py
...
可以读取lib文件夹中的.py很好。但是它无法通过子进程启动main.py。我不知道为什么它会一直重新启动test.py而不是因为抛出错误而停止了。
答案 0 :(得分:0)
我已经解决了您的任务,至少在我的Windows 10 64位计算机上,还需要进行以下操作:
使用Python 3.7
,PyInstaller不支持更高的Python版本。如果您的计算机上还有其他版本的Python,则也要安装Python 3.7。我在Python 3.7.3 64-bit
上进行了测试。我也在Python 3.8.2 64-bit
上进行了测试,实际上它也可以工作,但是.exe
的{{1}}与297 MB
不同,44 MB
是Py 3.7
,所以可能Pyinstaller配置不是对于Py 3.8进行了很好的调整/优化,这就是为什么二进制文件很大的原因。
用于打包的完整命令是pyinstaller --noconfirm --onefile --console --noupx --add-data "./main.py;./" --add-data "./lib/;./lib/" "test.py"
,在此命令中,重要是使用Python 3.7
到pyinstaller exe的完整路径,该命令在我的机器上将pyinstaller
替换为C:\bin\Python37\Scripts\pyinstaller.exe
。
在脚本test.py
的开头添加下一行:
import os, sys
os.chdir(getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))))
pybin = sys.executable
之后,请在各处使用pybin
变量,而不要在'python'
调用中使用subprocess
字符串,即,用subprocess.Popen(['python', 'main.py'...
代替subprocess.Popen([pybin, 'main.py'...
。
test.py
的正确版本可以be found here
完成!从test.py
更改2.
打包命令后,将生成有效的可执行文件dist/test.exe
。