Python 脚本导出到 .exe,包括一些 excel 和 numpy 计算

Python script export to .exe including some excel and numpy calculations

我有一个 python 3.7 (spyder) 脚本,它从给定的 .xlsx 文件收集数据并使用此数据创建立方体脊柱函数。

在这一步之后,脚本将遍历给定目录中的所有文件并对源文件进行一些 calculations/adjustments(使用三次样条函数),最后将新文件另存为新文件。

我尝试导出脚本,以便它可以 运行 在另一台计算机上(我使用 "Auto Py to Exe"),但它似乎工作得很好:

  1. .exe文件超大(300mb+)
  2. 超级超级慢

我在这里做错了什么?因为它实际上只是几行代码,所以文件不应该那么大,而且它确实应该 运行 在 1-2 秒内。

这些是导入的模块:

import numpy as np
import pandas as pd
from scipy import interpolate
from scipy.interpolate import CubicSpline
import os

这是完整的代码


import numpy as np
import pandas as pd
from scipy import interpolate
from scipy.interpolate import CubicSpline
import os

OESbaseline = pd.read_excel('OES_CubicSplineBaseline.xlsx')
x_baseline = OESbaseline['pre-CS']
y_baseline = OESbaseline['sample_known_ppm_with_flux']
cs = CubicSpline(x_baseline, y_baseline)
tck = interpolate.splrep(x_baseline, y_baseline)

def f(x_baseline):
    return interpolate.splev(x_baseline, tck)

basepath = "some_path"

for filename in os.listdir(basepath):

    file = os.path.join(basepath, filename)
    if os.path.isfile(file): 

        OESrun = pd.read_csv(file, skiprows=2)
        CorrectedData = f(OESrun['Concentration'])
        CorrectedData[CorrectedData < 0] = 0
        CorrectedDF = pd.DataFrame({'SampleID': OESrun['Label'], 
                                    'Recvd Wt. (kgs)': np.nan,
                                    'AQR (ppm)': np.around(CorrectedData,3),
                                    'Grav (ppm)': np.nan,
                                    'FA Notes': np.nan,                            
                                    'AQR (R1) (ppm)': np.nan,
                                    'Grav (R1) (ppm)': np.nan,                             
                                    'Assay Wt.(R1) (gr)': np.nan,
                                    'AQR (R2) (ppm)': np.nan,   
                                    'Grav (R2) (ppm)': np.nan,                              
                                    'Assay Wt.(R2) (gr)': np.nan,                                                  
                                    'CN (ppm)': np.nan,      
                                    'CN R (ppm)': np.nan,    
                                    '': np.nan,
                                    'Run Assay Wt.': OESrun['Weight'],
                                    'Grav. (OPT)': np.nan,     
                                    # 'OES Conc. (ppm)': np.around(OESrun['Concentration'],3),
                                    # 'CS Conc. (OPT)': np.around(CorrectedData*(1/34.285),4),                          
                                    'Recvd Wt. (lbs)': np.nan})
        # (OPTIONAL) remove the second (267) wavelength readings
        # CorrectedDF_1wave = CorrectedDF.iloc[::2, :]

        oldname =  os.path.splitext(filename)[0]
        oldext = os.path.splitext(filename)[1]
        new_filename = str(oldname + '_corrected' + oldext)

        # export to Excel
        CorrectedDF.to_csv(os.path.join(basepath, new_filename))

        # (OPTIONAL) export to CSV (1 wave only)
        #CorrectedDF_1wave.to_csv(OESrun_filename+'_Corrected'+'.csv')

我建议不要使用 pandas 和 numpy,除非它们是绝对必要的,它们会使你的编译代码变得庞大。与 scipy 相同。尝试自己编写一个表示三次样条的函数,以避免在编译代码中包含这些大型包。我怀疑错误消息是由文件不在 cwd 中引起的。

在虚拟环境中创建您的包,然后 pip 仅安装您 运行 您的脚本所需的包。这会将您的 .exe 文件从 +300MB 的 exe 缩小到 ~30MB 的 exe,其中包含 pandas,启动速度会快得多。

我个人的 goto 是虚拟环境,但你可以使用任何你喜欢的虚拟环境打包器:

第 1 步 - 在您的全局环境中 pip install virtualenv

pip install virtualenv

第 2 步 - 创建您的 venv

python -m virtualenv venv

第 3 步 - 激活您的 venv 并 pip 安装您的软件包

source venv/Scripts/activate

pip install pandas scipy numpy

第 4 步 - 运行 您在 venv 中的脚本以确保其正常工作

第 5 步 - 包(现在我不熟悉 "py to exe" 所以我不知道你是否可以将它指向一个 venv 但如果你不能这里是 pyinstaller 的步骤)

pip install pyinstaller

pyinstaller script.py --onefile