(%%)bash和bang(!)有什么区别

时间:2019-09-18 03:46:37

标签: bash google-cloud-platform gcloud shebang

在jupyter笔记本中,以下gcloud命令可用于bang(!),但不能用于%% bash

import os

PROJECT = 'mle-1234' 
REGION = 'us-central1' 
BUCKET = 'mle-1234'
# for bash
os.environ['PROJECT'] = PROJECT
os.environ['BUCKET'] = BUCKET
os.environ['REGION'] = REGION
os.environ['TFVERSION'] = '1.14.0'  # Tensorflow version

# Set GCP Project and Region
%%bash
gcloud config set project $PROJECT
gcloud config set compute/region $REGION

gcloud config list

当我使用%% bash执行上面的最后一个片段时,我得到了此错误消息

  File "<ipython-input-16-f93912dbcc34>", line 3
    gcloud config set project $[PROJECT]
                ^
SyntaxError: invalid syntax

但是,使用相同的代码行设置项目和区域值,但是要删除%% bash并在所有gcloud命令中添加前缀(!)。

# Set GCP Project and Region
!gcloud config set project $PROJECT
!gcloud config set compute/region $REGION

!gcloud config list

使用(!)的结果

Updated property [core/project].
Updated property [compute/region].

[compute]
region = us-central1
zone = us-central1-a
[core]
account = my-service-account@mle-1234.iam.gserviceaccount.com
disable_usage_reporting = False
project = mle-1234

What could be the reason for this behavior?

1 个答案:

答案 0 :(得分:0)

%% bash

  

%%bash被认为是 Built-in magic commands 的一部分。在子流程中使用bash运行单元格。这是%%script bash的快捷方式。您可以将来自多个内核的代码组合到一个笔记本中。例如:

%%HTML
%%python2
%%python3
%%ruby
%%perl

实现:

%%bash

factorial()
{
    if [ "$1" -gt "1" ]
    then
        i=`expr $1 - 1`
        j=`factorial $i`
        k=`expr $1 \* $j`
        echo $k
    else
        echo 1
    fi
}

input=5
val=$(factorial $input)
echo "Factorial of $input is : "$val

!命令

  

以爆炸字符(例如)开头的代码单元!,指示jupyter将该行上的代码视为 OS shell command

!cat /etc/os-release | grep VERSION

输出:

VERSION="16.04 LTS (Xenial Xerus)"
VERSION_ID="16.04" 

  

答案::由于您使用的是gcloud命令,因此Jupyter会将其解释为OS Shell命令。因此,使用!glcoud即可。