我正在开发一个模块,用于从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"`
答案 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调用时,它们可以让您的生活更轻松。