如何在Google Colab中卸载驱动器并重新挂载到另一个驱动器?

35

我已连接至Google Drive的A账户。现在我想要切换到B账户,但我无法这样做,因为执行drive.mount()时没有任何方法让我输入新的身份验证密钥。

我尝试过但失败了:

  1. 重新启动浏览器、计算机
  2. drive.mount()中使用force_remount=True,它只会自动重新挂载A账户,而不会要求我指定新的挂载目标。
  3. 更改账户A的密码
  4. 从GPU更改运行时类型为None,然后再改回GPU
  5. 以隐身模式打开所有内容
  6. 注销所有Google账户

如何实现以下操作:

  • 忘记先前的身份验证密钥,以便它能够要求我提供一个新的?
  • 卸载驱动器并忘记先前的身份验证密钥?
10个回答

42

我发现“重新启动运行时......”不起作用,而且权限更改太麻烦了。
幸运的是,drive模块配备了你所需的函数:

from google.colab import drive
drive.flush_and_unmount()

哇,谢谢,这正是我需要处理大文件的东西。 - JZL003

16
您可以从“运行时”菜单中选择“重置所有运行时...”选项来重置您的Colab后端。
请注意,这将放弃您当前的后端。

13

方法1:

  1. 重新启动运行时 = 重置您的Python shell 或者
  2. 断开并删除运行时 = 将分配给您的所有托管虚拟机返回到其原始状态。这在虚拟机因系统文件意外覆盖或安装不兼容软件等情况下变得不健康时非常有帮助。 输入图像描述

方法2:终止您的会话,然后再次运行您的代码。

步骤:

1) 点击"附加连接选项"按钮,然后选择"管理会话" 输入图像描述

2) 选择要终止的会话,然后点击"终止"按钮。 输入图像描述

4) 再次运行您的代码以进行身份验证:

from google.colab import drive
drive.mount('/content/gdrive')

关于这个主题的有趣资源:

  1. Colab和Python入门 --> 运行时
  2. 运行时 > 断开连接和删除运行时

12
为了在不等待或重置运行时的情况下强制Colab请求一个新的密钥,您可以撤销先前的密钥。 具体操作如下:
  1. 前往https://myaccount.google.com/permissions(或手动导航至您的Google帐户页面上的安全性管理第三方访问权限),
  2. 在右上角,选择您的个人资料图片或首字母缩写,然后选择您想要与Colab断开连接的驱动器所属的账户,
  3. Google应用程序部分中选择Google Drive文件流,然后选择删除访问权限
执行drive.mount()现在将会要求您提供一个新的密钥。

完成第三步后,我不得不强制重新安装才能使它正常工作:drive.mount('/content/gdrive', force_remount=True)。 - hoper

4

如果你最近使用 flush_and_unmount() 挂载和卸载,那么重新挂载可能无法正常工作。你应该按照以下正确步骤操作(在发布时对我有效):

使用以下命令进行挂载:

from google.colab import drive
drive.mount('/content/drive')

卸载驱动器的命令为:drive.flush_and_unmount(),虽然你看不到 'drive/' 文件夹,但请相信你需要在重新挂载驱动器之前使用 !rm -rf /content/drive 命令。

from google.colab import drive
drive.mount('/content/drive', force_remount=True)

你会再次收到新 Gmail 账户的授权请求。


!rm -rf /content/drive 是解决方案。否则,旧状态的Google驱动器会不断出现,这与当前Google驱动器内容的状态完全不同。 - mon

1
您可以在“运行时 -> 管理会话”中终止会话。这样就可以完成工作,然后您可以重新挂载驱动器。

0

症状

  1. /content/drive会自动挂载,而不需要输入输入您的授权代码:
  2. 缓存的旧状态一直出现。
  3. 实际的Google Drive内容没有显示出来。
  4. 终止、重新启动、恢复出厂设置、撤销权限、清除Chrome缓存都无效。
  5. 刷新和卸载google.colab.drive.flush_and_unmount()也无效。

解决方案

  1. 在挂载点/content/drive内创建一个虚拟文件。
  2. 花点时间确保/content/drive中的内容与Google Drive UI中的内容不同。
  3. 运行rm -rf /content/drive
  4. 运行google.colab.drive.flush_and_unmount()
  5. 从菜单Runtime -> Factory reset runtime中进行重置。
然后重新运行 google.colab.drive.mount('/content/drive', force_remount=True),最后会提示输入授权码

0
重新启动运行时并删除访问权限都没有帮助。我发现我使用的笔记本在挂载点上创建了目录:
from google.colab import drive
drive.mount('/content/drive')

Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).

我必须先删除挂载点上的子目录。首先确保您的驱动器实际上没有被挂载!

!find /content/drive

/content/drive
/content/drive/My Drive
/content/drive/My Drive/Colab Notebooks
/content/drive/My Drive/Colab Notebooks/assignment4
/content/drive/My Drive/Colab Notebooks/assignment4/output_dir
/content/drive/My Drive/Colab Notebooks/assignment4/output_dir/2020-04-05_16:17:15

这些文件和目录是在我挂载驱动器之前笔记本意外创建的。一旦你确定(你确定吗?)你的驱动器没有被挂载,然后删除子目录。

!rm -rf /content/drive

之后,我能够挂载驱动器。


0

以下是他们常见问题解答中的一段解释。

为什么驱动器操作有时会因配额而失败? Google Drive 强制执行各种限制,包括每个用户和每个文件操作计数和带宽配额。超过这些限制将触发上述的“输入/输出错误”,并在 Colab UI 中显示通知。典型原因是访问流行的共享文件或太快地访问太多不同的文件。解决方法包括:

使用 drive.google.com 复制文件,并不广泛共享,以便其他用户不会使用其限制。 避免进行许多小的 I/O 读取,而是选择将数据从 Drive 复制到 Colab VM 中的存档格式(例如 .zip 或 .tar.gz 文件),并在本地 VM 上解压缩数据,而不是在挂载的 Drive 目录中进行解压缩。 等待一天以重置配额限制。

https://research.google.com/colaboratory/faq.html#drive-quota


-1

drive.mount()函数的当前代码可在https://github.com/googlecolab/colabtools/blob/fe964e0e046c12394bae732eaaeda478bc5fa350/google/colab/drive.py找到。

它是驱动程序可执行文件/opt/google/drive/drive的包装器。我发现该可执行文件接受一个authorize_new_user标志,可用于强制重新验证。

将drive.py文件的内容复制并粘贴到您的笔记本中。然后修改第189行上当前调用d.sendline()的方式,使其看起来像这样(请注意添加authorize_new_user标志):

d.sendline(
      ('cat {fifo} | head -1 | ( {d}/drive '
       '--features=max_parallel_push_task_instances:10,'
       'max_operation_batch_size:15,opendir_timeout_ms:{timeout_ms},'
       'virtual_folders:true '
       '--authorize_new_user=True '
       '--inet_family=' + inet_family + ' ' + metadata_auth_arg +
       '--preferences=trusted_root_certs_file_path:'
       '{d}/roots.pem,mount_point_path:{mnt} --console_auth 2>&1 '
       '| grep --line-buffered -E "{oauth_prompt}|{problem_and_stopped}"; '
       'echo "{drive_exited}"; ) &').format(
           d=drive_dir,
           timeout_ms=timeout_ms,
           mnt=mountpoint,
           fifo=fifo,
           oauth_prompt=oauth_prompt,
           problem_and_stopped=problem_and_stopped,
           drive_exited=drive_exited))

调用drive模块版本的flush_and_unmount()或您粘贴的版本,然后调用您的mount()版本以作为不同用户登录!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接