Как отлаживать скрипты для PyPSA-EUR?

Я хотел бы установить некоторые точки останова VisualStudioCode или PyCharm для сценария.

https://github.com/PyPSA/pypsa-eur/blob/master/scripts/prepare_sector_network.py

а затем запустите и отладьте его, чтобы лучше понять, как он работает.

Обычно сценарии PyPSA-EUR запускаются как часть рабочего процесса Snakemake. Поэтому на данный момент я вижу несколько стратегий:

а) Создайте конфигурацию запуска (launch.json), которая использует Snakemake в качестве модуля Python или исполняемого файла.

б) Запустите сам скрипт с исполняемым файлом Python и имитируйте использование рабочего процесса Snakemake в соответствующей основной функции скрипта, если «snakemake» отсутствует в globals()

в) Используйте какой-нибудь специальный плагин для змеи, например

https://github.com/JetBrains-Research/snakecharm

https://open-vsx.org/extension/snakemake/snakemake-lang

(пока не поддерживает отладку)

=> Как рекомендуется это сделать и где я могу найти инструкции?

На самом деле файл сценария включает в себя основной раздел в конце файла:

if __name__ == "__main__":
  #...
  #snakemake = mock_snakemake(...)

Однако эта функциональность кажется устаревшей и/или служит другой цели? Я создал соответствующий билет об ошибке здесь:

https://github.com/PyPSA/pypsa-eur/issues/1118

Если вместо этого а) является рекомендуемым способом сделать это, может ли кто-нибудь предоставить пример настроек конфигурации запуска vscode launch.json и PyCharm?

Я попытался

а1) Используйте Snakemake в качестве модуля в конфигурации запуска PyCharm.

а2) Создайте фиктивный стартовый скрипт snake.py:

import sys
from snakemake.cli import main


if __name__ == "__main__":
    arguments = sys.argv[1:]
    main(arguments)

Установка точки останова в этом скрипте работает, и рабочий процесс Snakemake можно запустить с

python snake.py -call all

Однако точки останова внутри скрипта, на который ссылается файл Snakemake, не работают.

Связанный:

https://github.com/snakemake/snakemake/issues/2932

https://github.com/PyPSA/pypsa-eur/pull/107

Как отлаживать змеиный файл Snakemake в коде Visual Studio?

https://github.com/JetBrains-Research/snakecharm/issues/142

https://github.com/JetBrains-Research/snakecharm/issues/25

https://github.com/snakemake/snakemake/issues/247

https://github.com/snakemake/snakemake/issues/1607

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

О. Отладка будет работать «из коробки», если вы

  • используйте Snakemake в качестве модуля в конфигурации запуска PyCharm a1) и
  • импортируйте и запустите свой код Python в Snakefile напрямую с помощью директивы run вместо включения его с помощью изолирующей директивы shell или script.

# import your script in the Snakefile 
from src.foo_script import main as foo_main  

rule run_main:
    input:
        input_file = "input/input.txt"
    output:
        output_file = "output/output.txt"

    # do not use shell or script...
    # but a direct run command... this will keep the debugger attached:
    run:
        foo_main(input, output)

Б. Однако, пока PyPSA использует директиву Snakemake script для включения скриптов Python, вы вынуждены использовать обходной путь mock_snakemake для имитации глобального контекста Snakemake в специальном основном разделе вашего скрипта. Также см

Пример:

Допустим, вы хотите отладить сценарий «scripts/prepare_sector_network.py», следуя руководству.

https://pypsa-eur.readthedocs.io/en/latest/tutorial_sector.html

и запускаем команду

snakemake -call all --configfile config/test/config.overnight.yaml

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

1. Узнайте, какой выходной файл создается сценарием, который вы хотите отладить. Для этого вы можете найти имя правила в выводе консоли и просмотреть соответствующие строки вывода:

[Mon Jul  8 13:59:56 2024]
localrule prepare_sector_network:
    input: resources/test/profile_offwind-ac.nc, resources/test/profile_offwind-dc.nc, resources/test/profile_offwind-float.nc, resources/test/gas_network_elec_s_5.csv, resources/test/gas_input_locations_s_5.geojson, resources/test/gas_input_locations_s_5_simplified.csv, resources/test/snapshot_weightings_elec_s_5_ec_lv1.5_.csv, resources/test/networks/elec_s_5_ec_lv1.5_.nc, data/eurostat/Balances-April2023, resources/test/pop_weighted_energy_totals_s_5.csv, resources/test/pop_weighted_heat_totals_s_5.csv, resources/test/shipping_demand_s_5.csv, resources/test/transport_demand_s_5.csv, resources/test/transport_data_s_5.csv, resources/test/avail_profile_s_5.csv, resources/test/dsm_profile_s_5.csv, resources/test/co2_totals.csv, data/bundle/eea/UNFCCC_v23.csv, resources/test/biomass_potentials_s_5_2030.csv, resources/test/costs_2030.csv, resources/test/salt_cavern_potentials_s_5.csv, resources/test/busmap_elec_s.csv, resources/test/busmap_elec_s_5.csv, resources/test/pop_layout_elec_s_5.csv, resources/test/pop_layout_elec_s.csv, resources/test/industrial_energy_demand_elec_s_5_2030.csv, resources/test/hourly_heat_demand_total_elec_s_5.nc, resources/test/district_heat_share_elec_s_5_2030.csv, resources/test/temp_soil_total_elec_s_5.nc, resources/test/temp_soil_rural_elec_s_5.nc, resources/test/temp_soil_urban_elec_s_5.nc, resources/test/temp_air_total_elec_s_5.nc, resources/test/temp_air_rural_elec_s_5.nc, resources/test/temp_air_urban_elec_s_5.nc, resources/test/cop_soil_total_elec_s_5.nc, resources/test/cop_soil_rural_elec_s_5.nc, resources/test/cop_soil_urban_elec_s_5.nc, resources/test/cop_air_total_elec_s_5.nc, resources/test/cop_air_rural_elec_s_5.nc, resources/test/cop_air_urban_elec_s_5.nc, resources/test/solar_thermal_total_elec_s_5.nc, resources/test/solar_thermal_urban_elec_s_5.nc, resources/test/solar_thermal_rural_elec_s_5.nc
    output: results/test-sector-overnight/prenetworks/elec_s_5_lv1.5___2030.nc
    log: results/test-sector-overnight/logs/prepare_sector_network_elec_s_5_lv1.5___2030.log
    jobid: 4
    benchmark: results/test-sector-overnight/benchmarks/prepare_sector_network/elec_s_5_lv1.5___2030
    reason: Missing output files: results/test-sector-overnight/prenetworks/elec_s_5_lv1.5___2030.nc
    wildcards: simpl=, clusters=5, ll=v1.5, opts=, sector_opts=, planning_horizons=2030
    resources: tmpdir=/tmp, mem_mb=2000, mem_mib=1908

Если путь вывода трудно найти, вы также можете адаптировать сценарий для печати дополнительного вывода:

output_path = snakemake.output[0]
print('######## output_path ########')
print(output_path)

Пример выходного_путь:

results/test-sector-overnight/prenetworks/elec_s_5_lv1.5___2030.nc

Известные вопросы:

  • Чтобы сценарий действительно перезапустился, вам необходимо очистить ранее сгенерированные выходные данные:

    Snakemake -call purge # использует специальное правило очистки pypsa-eur

или используйте опцию --foreall (=-F), забыв обо всех промежуточных файлах и повторно загрузив исходники:

snakemake -call all --configfile config/test/config.overnight.yaml -F

Также смотрите https://snakemake.readthedocs.io/en/stable/executing/cli.html#execution

  • Если вы попытаетесь создать этот файл, используя

    Snakemake -c 1 результаты/test-sector-overnight/prenetworks/elec_s_5_lv1.5___2030.nc

ты можешь получить

MissingRuleException:
No rule to produce results/test-sector-overnight/prenetworks/elec_s_5_lv1.5___2030.nc (if you use input functions make sure that they don't raise unexpected exceptions).

2. Найдите шаблон, используемый соответствующим правилом Snakemake для выходного файла.

Для сценария «scripts/prepare_sector_network.py» соответствующим правилом является «prepare_sector_network» в файле «rules/build_sector.smk», и его выходные данные определяются как:

output:
        RESULTS
        + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc",

3. Определите подстановочные знаки , сравнив шаблон с фактическим путем к выходному файлу:

simpl: ''
clusters: '5'
ll: 'v1.5'
opts: ''
sector_opts: ''
planning_horizons: '2030' 

# RESULTS: 'results/test-sector-overnight'
# RESULTS = "results/" + RDIR
# RDIR = 'test-sector-overnight'

4. Найдите основной раздел скрипта Python (прокрутите вниз до конца «scripts/prepare_sector_network.py» или найдите «mock_snakemake») и адаптируйте вызов к mock_snakemake для воспроизведения этих подстановочных знаков. Также обязательно используйте тот же файл конфигурации, что и исходная команда. (Путь RDIR и RESULTS определяется автоматически на основе соответствующего аргумента configfiles.)

snakemake = mock_snakemake(
    "prepare_sector_network",
    configfiles = "config/test/config.overnight.yaml",
    simpl = "",
    clusters = "5",
    ll = "v1.5",
    opts = "",
    sector_opts = "", 
    planning_horizons = "2030",
)

5. Установите точку останова и запустите скрипт в желаемой IDE.

python prepare_sector_network.py

Условием debug mode под "snakemake" not in globals() будет if __name__ == "__main__", а вызов True подготавливает некоторый контекст для сеанса отладки.

6. Известные проблемы

Если вы столкнулись с проблемами с несуществующими файлами:

Убедитесь, что вы используете правильный файл конфигурации и что строка mock_snakemake не закомментирована и не пропускает папку «config» в своем пути:

# configfiles = "config/test/config.overnight.yaml"

Если вы используете неправильный файл конфигурации, «тестовая» часть может отсутствовать в некоторых путях к файлам, например.

resources/networks/elec_s_5_ec_lv1.5_.nc

вместо

resources/test/networks/elec_s_5_ec_lv1.5_.nc

и вы получите configfiles.

б) Повторно запустите исходную команду из консоли, чтобы сначала запустить полный рабочий процесс Snakemake, чтобы все входные файлы существовали для сценария, который вы хотите отладить.

C. Если вы хотите детально проверить выполнение заданий в Snakemake, вы можете установить точки останова в следующих точках входа:

https://github.com/snakemake/snakemake-interface-executor-plugins/blob/main/snakemake_interface_executor_plugins/executors/base.py => FileNotFoundError

https://github.com/snakemake/snakemake/blob/main/snakemake/executors/local.py => run_jobs

Другие вопросы по теме