pyinstaller如何在文件夹中包含.py

时间:2020-10-30 15:23:13

标签: python pyinstaller executable py2exe

我的机器是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而不是因为抛出错误而停止了。

1 个答案:

答案 0 :(得分:0)

我已经解决了您的任务,至少在我的Windows 10 64位计算机上,还需要进行以下操作:

  1. 使用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 MBPy 3.7,所以可能Pyinstaller配置不是对于Py 3.8进行了很好的调整/优化,这就是为什么二进制文件很大的原因。

  2. 用于打包的完整命令是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

  3. 在脚本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

  4. 完成!从test.py更改2.打包命令后,将生成有效的可执行文件dist/test.exe