Я экспериментирую с интеграцией 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 со всем содержимым, которое я мог бы захотеть), это решило бы проблему.