在Google Colab中更改目录(退出Python解释器)

153

我正在尝试使用Google Collab进行git克隆并进入该目录,但无法进入。我做错了什么?

!rm -rf SwitchFrequencyAnalysis && git clone https://github.com/ACECentre/SwitchFrequencyAnalysis.git

!cd SwitchFrequencyAnalysis

!ls datalab/ SwitchFrequencyAnalysis/

你期望它输出SwitchFrequencyAnalysis目录的内容,但实际上是根目录。我感觉我缺少一些明显的东西-是与Python解释器有关吗?(文档在哪里?)

点此查看演示。


3
Bob Smith的下面的回答是正确的,但如果你想知道为什么上面的方法没有起作用:问题在于每个以!为前缀的命令都在自己的子shell中运行--因此!cd会启动一个新的shell,切换目录,然后杀掉该shell。然后!ls在当前目录中重新开始。执行!cd SwitchFrequencyAnalysis && ls将会起作用,但在这里使用Python的os.chdir更加清晰明了。 - Craig Citro
6个回答

215

14
为什么cd命令使用%作为前缀,而pwd命令使用!作为前缀? - cloudscomputes
6
如其他评论所述,!% 之间存在区别。以 ! 开头的命令是全局的,会在整个系统中运行;而以 % 开头的命令仅适用于当前环境(主环境和当前项目的虚拟环境)。因此,应该使用 % 启动 cd 命令,以告诉编译器我们正在更改当前临时子 shell 的目录。 - armiro

138

正如其他人指出的那样,cd 命令需要以百分号开头:

%cd SwitchFrequencyAnalysis

%!的区别

Google Colab似乎从Jupyter(而Jupyter则是从IPython继承来的)中继承了这些语法。Jake VanderPlas在这里解释了IPython的行为。您可以在下面看到摘录。

如果你使用IPython的shell命令一段时间,你可能会注意到你不能使用!cd来导航文件系统:

In [11]: !pwd 
/home/jake/projects/myproject

In [12]: !cd ..

In [13]: !pwd 
/home/jake/projects/myproject 

原因是笔记本中的Shell命令在临时子Shell中执行。如果您想以更持久的方式更改工作目录,可以使用%cd魔术命令:

In [14]: %cd ..
/home/jake/projects
另一种看待这个问题的方式是:你需要使用%,因为改变目录对于当前笔记本环境是相关的,但不影响整个服务器运行时环境。
通常情况下,如果命令可以在单独的shell中运行,则使用!。如果命令需要在特定的notebook上运行,则使用%

2
你也可以只使用“cd”,而不需要使用!cd或%cd。这是做什么的呢?谢谢! - Erik
1
@Erik,从Google Colab的文档弹出窗口中可以看到,cd是一个预定义函数,%cd魔术命令与其绑定。当您键入纯粹的cd时,它会带来具有特定快捷方式参数的函数。声明没有参数意味着返回到/root目录。 - armiro

48

1
太好了!那么,/content/root是否指向同一文件夹位置。我的意思是,我很难理解googleColab中的命令与底层Linux-VM文件系统的关系。因为无论您执行%cd /content | ls!ls -la | pwd,您最终都会看到使用命令集!pip install -U -q kaggle后创建的/root/.kaggle,然后是!mkdir -p ~/.kaggle,这意味着~/即主目录等同于/root/content,是这些吗? - Anu

32
如果你想使用cd或ls功能,你需要在函数名称之前加上适当的标识符(分别是%和!)。使用%cd和!ls来导航。

.

!pwd    # to find the directory you're in ,
%cd ./samplefolder  #if you wanna go into a folder (say samplefolder)

或者如果你想要离开当前文件夹
%cd ../      

然后根据需要导航到相应的文件夹/文件。

3
请问您能指出我可以找到上述用法的来源吗?另外,我想使用管道操作符“|”,就像我们在Bash shell脚本中使用的一样,对此有什么建议吗?此外,使用“%”或“!”有何区别? - Anu
!ls命令不会显示当前目录,而是显示子文件夹的列表。 - undefined
1
@TimotheeW,谢谢你指出这个问题。由于我写这个答案已经快5年了,我真的不记得那时候!ls是否会给出某种绝对路径。但是现在看来,!pwd似乎能解决问题,我会相应地进行编辑。谢谢。 - undefined

30

2
还要补充一点,您需要先在Colab中挂载Google Drive并授权Google Drive文件流。 - Princy
你救了我的命。 - Davidson Lima

3

我相信在进行其他操作之前,您需要先挂载Google Drive。

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

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