Я хотел бы установить некоторые точки останова 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






О. Отладка будет работать «из коробки», если вы
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