snakemake.remote.EGA: NameError: имя 'self' не определено - PullRequest
1 голос
/ 27 сентября 2019

Я хочу использовать утилиту snakemake (5.6.0), чтобы использовать файлы, хранящиеся в EGA.Сначала я хотел попробовать код, написанный в официальной документации, поэтому я попробовал это:

import snakemake.remote.EGA as EGA

ega = EGA.RemoteProvider()

rule get_remote_file_ega:
   input:
       ega.remote("ega/dataset_id/foo.bam")
   output:
       "data/foo.bam"
   shell:
       "cp {input} {output}"

Перед выполнением скрипта я создал необходимые переменные окружения (EGA_USERNAME и EGA_PASSWORD).

ЗатемЯ получаю следующую ошибку:

me:~/scripts$ snakemake -s test_ega.smk
Building DAG of jobs...
Traceback (most recent call last):
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/__init__.py", line 551, in snakemake
    export_cwl=export_cwl)
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/workflow.py", line 433, in execute
    dag.init()
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/dag.py", line 122, in init
    job = self.update([job], progress=progress)
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/dag.py", line 603, in update
    progress=progress)
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/dag.py", line 655, in update_
    missing_input = job.missing_input
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/jobs.py", line 396, in missing_input
    for f in self.input
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/jobs.py", line 397, in <genexpr>
    if not f.exists and not f in self.subworkflow_input)
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/io.py", line 208, in exists
    return self.exists_remote
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/io.py", line 119, in wrapper
    v = func(self, *args, **kwargs)
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/io.py", line 258, in exists_remote
    return self.remote_object.exists()
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/remote/EGA.py", line 173, in exists
    return self.parts.path in self.provider.get_files(self.parts.dataset)
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/remote/EGA.py", line 126, in get_files
    "data/metadata/datasets/{dataset}/files".format(dataset=dataset))
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/remote/EGA.py", line 96, in api_request
    headers["Authorization"] = "Bearer {}".format(self.token)
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/remote/EGA.py", line 77, in token
    self._login()
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/remote/EGA.py", line 45, in _login
    "client_id"    : self._client_id(),
  File "/home/puissant/miniconda3/lib/python3.7/site-packages/snakemake/remote/EGA.py", line 151, in _client_id
    return self._credentials("EGA_CLIENT_ID")
NameError: name 'self' is not defined

Там есть часть кода (строка 151 EGA.py):

1   @classmethod
2   def _client_id(cls):
3         return self._credentials("EGA_CLIENT_ID")

Может быть, ошибка произошла от "я" вместоиз "cls" в строке 3?Потому что после изменения его на «cls» ошибка переместилась в следующий блок, построенный таким же образом.Мое понимание объектов Python ограничено, я надеюсь, что не говорю больших абсурдов.

Я забыл какие-либо шаги или неправильно понял какой-либо из них?

1 Ответ

0 голосов
/ 27 сентября 2019

Вы правы, вы должны использовать cls (что, по-видимому, здесь означает «класс»), а не self.self обычно это имя, используемое для экземпляров классов, т.е. объектов.Если вы используете self в другом месте функции, вам нужно переключить их на cls.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...