如何从ipython shell命令`get_ipython()。system.raw()获取`stdout`?

时间:2018-02-04 07:14:29

标签: ipython jupyter-notebook gsutil google-colaboratory

我正在开发一个模块,用于从colaboratory向tensorflow添加保存/恢复检查点到Google云存储(请参阅:https://github.com/mixuala/colab_utils)。我的代码使用ipython magic和shell命令从笔记本shell开始工作。但我发现你不能从python模块中导入这些方法(dooh!)所以现在我正在尝试转换为python native。

如何从`get_ipython()。system.raw()获取stdout? 我希望获得与以下相同的价值:

# ipython shell command
!gsutil ls $bucket_path

我尝试使用get_ipython().system_raw(),但我没有从stdout获得值。

  bucket = "my-bucket"
  bucket_path = "gs://{}/".format(bucket)
  retval = get_ipython().system_raw("gsutil ls {}".format(bucket_path))
  print(bucket_path, gsutil_ls)
  # BUG: get_ipython().system_raw) returns None 
  #     retval != !gsutil ls $bucket_path
  if "BucketNotFoundException" in gsutil_ls[0]:
    raise ValueError("ERROR: GCS bucket not found, path={}".format(bucket_path))



  # retval == None

有更好的方法吗?

[解决]

根据以下答案,这是更好的方法:

from google.cloud import storage

def gsutil_ls(bucket_name, project_id):
  client = storage.Client( project=project_id )
  bucket_path = "gs://{}/".format(bucket_name)

  bucket = client.get_bucket(bucket_name)
  files = ["{}{}".format(bucket_path,f.name) for f in bucket.list_blobs() ]
  # print(files)
  return files


bucket_name = "my-bucket" 
gsutil_ls(bucket_name, "my-project")
# same as `!gsutil ls  "gs://{}/".format(bucket_name) -p "my-project"` 

2 个答案:

答案 0 :(得分:2)

找到了它。

result = get_ipython().getoutput(cmd, split=True)

请参阅:https://github.com/ipython/ipython/blob/master/IPython/core/interactiveshell.py

答案 1 :(得分:0)

我建议使用Google Cloud Python Client Libraries for Cloud Storage。这些库用于与Google Cloud Platform服务交互,它们使用一组不同的编码语言编写。您可以在this page中找到有关Cloud Storage客户端库的详细文档,但我还为您编写了一个小示例代码,它返回的内容与您尝试使用的gsutil ls <YOUR_BUCKET>命令相同。

from google.cloud import storage

client = storage.Client()
bucket_name = "<YOUR_BUCKET_NAME>"
bucket_path = "gs://{}/".format(bucket_name)

bucket = client.get_bucket(bucket_name)
blobs = list(bucket.list_blobs())
for blob in blobs:
    print("{}{}".format(bucket_path,blob.name))

运行此代码的输出如下:

gs://<YOUR_BUCKET_NAME>/file_1.png
gs://<YOUR_BUCKET_NAME>/file_2.png
gs://<YOUR_BUCKET_NAME>/file_3.png

与运行gsutil ls <YOUR_BUCKET>的结果相同,所以也许你可以从那一点开发。在任何情况下,我都会强烈选择云存储客户端库,因为所有(或大多数)功能都可以通过它们获得,并且当尝试从脚本进行API调用时,它们可以让您的生活更轻松。