Is there any way to upload my code in .py files and import them in colab code cells?
The other way I found is to create a local Jupyter notebook then upload it to Colab, is it the only way?
You can save it first, then import it.
from google.colab import files
src = list(files.upload().values())[0]
open('mylib.py','wb').write(src)
import mylib
Update (nov 2018): Now you can upload easily by
Update (oct 2019): If you don't want to upload every time, you can store it in S3 and mount it to Colab, as shown in this gist
Update (apr 2020): Now that you can mount your Google Drive automatically. It is easier to just copy it from Drive than upload it.
mylib.py in your DriveFiles viewMount Drive then Connect to Google Drive!cp drive/MyDrive/mylib.py .import mylib. at end of !cp drive/MyDrive/mylib.py .. Anyhow, this is a clean and nice solution. Solved my big problem. Thanks a ton. Moreover, I really appreciate for updating the answer with colab updating time to time. Really appreciate that.In case anyone else is interested to know how to import files/packages from gdrive inside a google colab. The following procedure worked for me:
1) Mount your google drive in google colab:
from google.colab import drive
drive.mount('/content/gdrive/')
2) Append the directory to your python path using sys:
import sys
sys.path.append('/content/gdrive/mypythondirectory')
Now you should be able to import stuff from that directory!
%load filename.py.%load repo_name/filename.pyBased on the answer by Korakot Chaovavanich, I created the function below to download all files needed within a Colab instance.
from google.colab import files
def getLocalFiles():
_files = files.upload()
if len(_files) >0:
for k,v in _files.items():
open(k,'wb').write(v)
getLocalFiles()
You can then use the usual 'import' statement to import your local files in Colab. I hope this helps
We can do so.
import sys
import os
py_file_location = "/content/drive/My Drive"
sys.path.append(os.path.abspath(py_file_location))
Now you can import it as module in notebook for that location.
import whatever
/content doesn't contain drive. So it is impossible to access my filesI face the same problem. After reading numerous posts, I would like to introduce the following solution I finally chose over many other methods (e.g. use urllib, httpimport, clone from GitHub, package the modules for installation, etc). The solution utilizes Google Drive API (official doc) for proper authorization.
id=" - the file id assigned by Google Drive!pip install pydrive # Package to use Google Drive API - not installed in Colab VM by default
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth # Other necessary packages
from oauth2client.client import GoogleCredentials
auth.authenticate_user() # Follow prompt in the authorization process
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
your_module = drive.CreateFile({"id": "your_module_file_id"}) # "your_module_file_id" is the part after "id=" in the shareable link
your_module.GetContentFile("your_module_file_name.py") # Save the .py module file to Colab VM
import your_module_file_name # Ready to import. Don't include".py" part, of course :)
Last but not least, I should credit the original contributor of this approach. That post might have some typo in the code as it triggered an error when I tried it. After more reading and troubleshooting my code snippets above worked (as of today on Colab VM OS: Linux 4.14.79).
Try this way:
I have a package named plant_seedlings. The package is stored in google drive. What I should do is to copy this package in /usr/local/lib/python3.6/dist-packages/.
!cp /content/drive/ai/plant_seedlings.tar.gz /usr/local/lib/python3.6/dist-packages/
!cd /usr/local/lib/python3.6/dist-packages/ && tar -xzf plant_seedlings.tar.gz
!cd /content
!python -m plant_seedlings
Mount Drive button of google drive. Then drive folder will appear under content folder.Below are the steps that worked for me
from google.colab import drive drive.mount('/content/drive')
import sys sys.path.insert(0,’/content/drive/My Drive/ColabNotebooks’)
%cd drive/MyDrive/ColabNotebooks %pwd
import my_module
If you get the following error 'Name Null is not defined' then do the following
5.1 Download my_module.ipynb from colab as my_module.py file (file->Download .py)
5.2 Upload the *.py file to drive/MyDrive/ColabNotebooks in Google drive
5.3 import my_module will work now
This is how I regularly do it:
Save my module in the directory. Say MyFile.py in MyModules
Define the location of my module:
path_m = '/content/drive/MyDrive/Colab Notebooks/MyModules/'
Then I add the path to sys.path:
import sys
sys.path.insert(0,path_m)
import the module into my Jupyter/Google Colab notebook.
import MyFile
You can upload those .py files to Google drive and allow Colab to use to them:
!mkdir -p drive
!google-drive-ocamlfuse drive
All your files and folders in root folder will be in drive.
It's Jun 2019.
Make sure in the Python package's __init__.py all related files are imported in order. Push the code to Git or use this code.
for e.g,
from .Boxes import *
from .Circles import *
from .Rectangles import *
...
Don't use Package name in __init__.py file for importing the files.
in Google colab,
! rm -rf SorghumHeadDetection
! git clone https://github.com/user/amazing-repo-name/
you can do this by mount your drive to colab and write some code to put the id of your python file you can find code here importing python file from drive to colab
# Code to read file into colaboratory:
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
#Autheticate E-Mail ID
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
#2.1 Get the file
your_module = drive.CreateFile({"id": 'write your file id here'}) # "your_module_file_id" is the part after "id=" in the shareable link
your_module.GetContentFile("write the file name here") # Save the .py module file to Colab VM
import file_name
from file_name import anything #as classes or functions from your file
In my case, the file I was trying to use was called client.py. This raised a conflict because there's already a library called client in /usr/local/lib/python3.7/dist-packages/.
I solved this by uploading the client.py file to the same Google Drive folder in which the Colab Notebook is saved in and change its name to something unique that doesn't appear in the dist-packages folder.
In my case, I changed the file name to dfsclient.py and then just imported it with
import dfsclient
Then I implemented Kamal's answer:
import sys
sys.path.insert(0, '/content/drive/MyDrive/my_folder')
I found a better way that make process automatic. first as said here need to mistune Python package. just install it by below command in Colab Code box:
!pip install --upgrade 'nbconvert>=7' 'mistune>=2'
next you need to connect your Google Drive to Colab by below Command:
from google.colab import drive
from pathlib import Path
# I need to some Paths in my Project.You could remove them
colab_root = Path('/content')
drive_path = colab_root.joinpath('drive')
#mount google drive if not mounted
if not drive_path.exists():
drive.mount(str(drive_path))
drive_path = drive_path.joinpath('My Drive')
notebooks_root = drive_path.joinpath('Colab Notebooks')
print(notebooks_root.exists()) #for testing
next you need to run this command:
%cd {notebooks_root}
!jupyter nbconvert --to python '<module_name>.ipynb'
then you need to add Colabs path to your Python paths:
import sys
sys.path.insert(0,str(notebooks_root))
and now you could test your module is imported by below:
try:
import <YourModule>
print(f'module {<YourModule>.__name__} imported successfully')
except ModuleNotFoundError as e:
raise ModuleNotFoundError(repr(e))
!pip install should be %pip install in Google Colab and modern Jupyter. The magic pip command variation was added in 2019 to insure the install occurs in the environment where the kernel is running that backs the active notebook. The exclamation point doesn't do that and can lead to issues. Google Colab had specifically made it so it wouldn't cause issues but finally added support for it recently to bring it more in line with the broader, true Jupyter Community. See more about the modern, magic %pip install ....py files. It looks like from '<module_name>.ipynb' what you wanted to import was in another notebook. You should mention that because those with a .py won't need that step. There are packages also to directly import from .ipynb files but I don't know how well they integrate with Google Colab as it isn't true Jupyter consistent with the broader community.Full shortcut (faster than clone) to load specific folders (here src and locale) from github repository (here under tag v0.9.4):
!git -c init.defaultBranch=main init
!git sparse-checkout init
!git sparse-checkout set src locale
!git remote add origin https://github.com/halt9k/fluxfilter-extended.git
!git fetch --depth 1 origin v0.9.4
!git -c advice.detachedHead=false checkout FETCH_HEAD`
from src.helpers.py_helpers import init_logging
# from ... import ...