Python экспорт скриптов в .exe, включая некоторые вычисления в Excel и numpy - PullRequest
1 голос
/ 09 января 2020

У меня есть скрипт python 3.7 (spyder), который собирает данные из заданных файлов .xlsx и использует эти данные для создания функции позвоночника cubi c.

После этого шага скрипт просматривая все файлы в данном каталоге и производя некоторые вычисления / корректировки исходных файлов (используя функцию сплайна cubi c) и, наконец, сохраняет новые файлы как новые.

Я попытался экспортировать сценарий, чтобы его можно было запустить на другом компьютере (я использовал «Auto Py to Exe»), который, однако, прекрасно работал:

  1. .exe-файл очень большой (300 МБ +)
  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')

Ответы [ 2 ]

1 голос
/ 09 января 2020

Создайте свой пакет в виртуальной среде и установите только те пакеты, которые необходимы для запуска вашего скрипта. Это сократит ваши .exe-файлы из + 300 МБ exe-файла до ~ 30 МБ exe-файла с pandas в нем, который будет намного быстрее загружаться.

мой личный переход - виртуальная среда, но вы можете использовать любую виртуальную среду Вам понравился упаковщик:

шаг 1 - в глобальном окружении pip установите virtualenv

pip install virtualenv

шаг 2 - создайте свой венв

python -m virtualenv venv

шаг 3 - активируйте свой венв и 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
1 голос
/ 09 января 2020

Я бы предложил не использовать pandas и numpy, если они не являются абсолютно необходимыми, они сделают ваш скомпилированный код огромным. То же самое со Сципи. Попробуйте написать функцию, представляющую сплайн cubi c, чтобы не включать эти большие пакеты в ваш скомпилированный код. Я подозреваю, что сообщение об ошибке вызвано отсутствием файла в cwd.

...