Можно ли импортировать файл python в Google Colab, который сам импортирует репозиторий GitHub для работы? - PullRequest
0 голосов
/ 13 января 2020

Я экспериментирую с интеграцией Google Colab, GitHub и Google Drive. Я хочу иметь возможность создавать файлы, в частности, Gists, но также и целые репозитории, которые ссылаются на другие Gists и репозитории в качестве зависимостей. Для примера с игрушкой, который я использовал для эксперимента, у меня есть простой скрипт .py, который запускает следующее:

import random

def dice_roll():
  roll = random.randint(1,6)
  return roll

Это просто возвращает целое число от 1 до 6. Но предположим, что я беру этот файл, сохранен как Gist и импортирован в Colab, чтобы я мог его использовать. В целом этот небольшой скрипт импорта выглядел бы примерно так:

# Clone the entire repo.
!git clone -l -s https://gist.github.com/dcdesmond/28276a70d5d5611d3e0f4f5717eca535 cloned-repo

# Change directory into cloned repo
%cd cloned-repo

# List repo contents
!ls

Это прекрасно работает, и в ячейке ноутбука Colab, где он запускается, вывод будет:

Cloning into 'cloned-repo'...
warning: --local is ignored
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
/content/cloned-repo
dice_roll.py

Таким образом, если

import dice_roll
dice_roll.dice_roll()

будет запущен в следующей ячейке, он выведет целое число от 1 до 6. Но этот вывод зависит от модуля, содержащегося во внешнем GistHub Gist. Поэтому, если я хочу начать наслоение своих Gists (или даже всего репо, с течением времени), чтобы модули автоматически обращались к ссылке GitHub для требуемых зависимостей, разумно было бы подумать, что я могу загрузить все вышеперечисленное как составной Файл .py, который будет запускаться как один скрипт (назовите его dice_roller.py), как показано ниже:

# Clone the entire repo.
!git clone -l -s https://gist.github.com/dcdesmond/28276a70d5d5611d3e0f4f5717eca535 cloned-repo

# Change directory into cloned repo
%cd cloned-repo

# List repo contents
!ls

import dice_roll
dice_roll.dice_roll()

, а затем повторите процесс: клонируйте этот составной файл .py в записную книжку Colab и запустите его ( и все его многоуровневые зависимости), которые гипотетически производят один и тот же вывод (целое число от 1 до 6) или, в более сложном сценарии, сеть ссылочных репозиториев и их файлов.

Но если я сохраню все это в одном dice_roller.py сценарии, сохраненном как репозиторий Gist и клонируем его таким же образом:

!git clone -l -s https://gist.github.com/dcdesmond/bda461a04705ab570747a4e7685b0372 cloned-repo
%cd cloned-repo
!ls

с тем же рабочим выходом:

Cloning into 'cloned-repo'...
warning: --local is ignored
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
/content/cloned-repo
dice_roller.py

Тогда я сталкиваюсь с ошибкой синтаксического разбора, потому что python не может прочитать команды git clone:

import dice_roller
  File "/content/cloned-repo/cloned-repo/dice_roller.py", line 12
    !git clone -l -s https://gist.github.com/dcdesmond/28276a70d5d5611d3e0f4f5717eca535 cloned-repo
    ^
SyntaxError: invalid syntax

Есть ли способы pythoni c автоматического взаимодействия с хранилищами и их содержимым между сценариями таким образом, чтобы Colab приспособился?

Возможно, я изобрету колесо здесь, если есть другой способ достижения sh этой цели написания сценариев, которые извлекают файлы, содержащиеся в нем. в других хранилищах, а затем использует их. Мне кажется, что это конфликт между навигацией / командами файловой системы и самим python, а не проблема Google Colab. Поскольку Colab - это просто IPython / Jupyter онлайн, я бы предположил, что кто-то сталкивался с подобной проблемой локально. Если есть другой способ подумать о проблеме, чтобы мне нужно было импортировать только один репо или один файл (без необходимости реплицировать репозитории ad ho c со всем содержимым, которое я мог бы захотеть), это решило бы проблему.

1 Ответ

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

Вам необходимо заменить ! и %cd обычными Python эквивалентами.

  • ! становится getoutput
  • % cd становится os.chdir ("...")

Вот результат

%%writefile dice_roller2.py
import os
from subprocess import getoutput
getoutput("git clone -l -s https://gist.github.com/dcdesmond/28276a70d5d5611d3e0f4f5717eca535 cloned-repo")
os.chdir('cloned-repo')
import dice_roll
print(dice_roll.dice_roll())

Вот работоспособный ноутбук .

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