从 groovy 脚本运行 gsutil:找不到 Python 可执行文件

Posted

技术标签:

【中文标题】从 groovy 脚本运行 gsutil:找不到 Python 可执行文件【英文标题】:Running gsutil from a groovy script: Could not find Python executable 【发布时间】:2017-06-17 13:34:16 【问题描述】:

我有一个 groovy 脚本,它可以获取有关我在不同公司的所有应用销售的数据并为我生成报告。这一直运行良好,但我已迁移到新服务器,现在遇到了问题。

要从 Google Play 下载 android 应用销售,您必须使用 gsutil 命令从 Google 存储复制销售数据。因此,在我的 groovy 脚本中,我执行该命令。它在我的旧服务器上运行良好,当我在新服务器上的 shell 中发出相同的命令时它运行正常。

它只是在 groovy 脚本中的新服务器上不起作用。这是我得到的错误:

$ ./fetch_googleplay_report.groovy 2017-01-29
Fetching 2017-01-29 for Android Google Play
Running command: /usr/bin/gsutil cp -r gs://pubsite_prod_rev_XXXXXXXXXXXXX/sales/salesreport_201701.zip .
gsutil command output: 
gsutil command error output: which: no python2 in ((null))
which: no python2.7 in ((null))
Traceback (most recent call last):
  File "/usr/lib64/google-cloud-sdk/bin/bootstrapping/gsutil.py", line 75, in <module>
    main()
  File "/usr/lib64/google-cloud-sdk/bin/bootstrapping/gsutil.py", line 59, in main
    'platform/gsutil', 'gsutil', *args)
  File "/usr/lib64/google-cloud-sdk/bin/bootstrapping/bootstrapping.py", line 45, in ExecutePythonTool
    execution_utils.ArgsForPythonTool(_FullPath(tool_dir, exec_name), *args))
  File "/usr/lib64/google-cloud-sdk/lib/googlecloudsdk/core/execution_utils.py", line 170, in ArgsForPythonTool
    python_executable = kwargs.get('python') or GetPythonExecutable()
  File "/usr/lib64/google-cloud-sdk/lib/googlecloudsdk/core/execution_utils.py", line 59, in GetPythonExecutable
    raise ValueError('Could not find Python executable.')
ValueError: Could not find Python executable.

$ which python
/usr/bin/python
$ which python2
/usr/bin/python2

Python 肯定已安装并且在我的路径中,但是当我的 groovy 脚本调用 gsutil 运行时,它似乎找不到它。我从堆栈跟踪中猜测,当它说no python2 in ((null)) 时,这意味着它的路径为空。不过我不确定。

这是执行命令的常规代码 sn-p:

def cmd = "/usr/bin/gsutil cp -r gs://pubsite_prod_rev_XXXXXXXXXXX/sales/$reportfilename .";

println("Running command: $cmd")

def out = new StringBuffer(), err = new StringBuffer()
def proc = cmd.execute([], incomingdir)
proc.consumeProcessOutput(out, err)
proc.waitForOrKill(5000)

println("gsutil command output: $out")
println("gsutil command error output: $err")

编辑:如果我将 gsutil 命令移动到一个 shell 脚本中,在其中我专门获取我的 .bash_profile 来设置我的 PATH 并让 groovy 脚本调用那个 shell 脚本,那么文件就可以下载好了。

因此,这似乎是从 groovy 脚本调用 gsutil 的问题。有什么想法吗?

【问题讨论】:

CLOUDSDK_PYTHON 变量是否在您的 shell 之间设置不同,但在您的 groovy 脚本中却没有,是偶然的吗?如果不是,我认为您的 groovy 脚本中的系统路径不同是正确的。这似乎独立于 gsutil/gcloud - 你需要确保 python 在路径上。 python 肯定在我的 shell 路径中(如 which 命令所示),但是如何控制 groovy 脚本中的路径环境?我已经在我的shell中设置CLOUDSDK_PYTHON指向/usr/bin/python2,但是我在我的shell中设置的环境变量显然也不可用,显然,在执行groovy脚本时......但这一切都在我的旧服务器上工作。我很困惑。 这确实是一个关于 groovy 环境变量的问题(因为脚本中的“which”不起作用)。或许***.com/questions/21236268/… 可以帮忙? 其他 SO 帖子上的答案只是建议将缺少的环境变量作为参数传递,但我的问题是 gsutil 是试图访问环境的脚本,它不需要那些东西作为参数。 :( 啊,我明白了。看来问题只是如何将环境从 groovy 传递到 Python。 cmd.execute 的第一个参数是环境,所以不要传递一个空列表,你可以按照coderwall.com/p/nswp1q/calling-other-processes-from-groovy 中的描述包含它吗? 【参考方案1】:

在这种情况下,您应该在执行 Google Cloud SDK 工具前加上 CLOUDSDK_PYTHON=/usr/bin/python,例如。

CLOUDSDK_PYTHON=/usr/bin/python gsutil cp -r ...

此解决方法来自hidekuro in github.com/GoogleCloudPlatform/gsutil/issues/402.

【讨论】:

以上是关于从 groovy 脚本运行 gsutil:找不到 Python 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

cloud/gsutil 将文件从实例复制到存储桶

如何从 python 脚本成功调用 gsutil rsync?

如何在 Jenkins 中使用 Groovy 脚本设置颠覆工作区格式?

在单独的步骤中执行时找不到 gsutil 命令 - bitbucket 管道

詹金斯“找不到捆绑命令”

权限被拒绝的 gsutil cp 错误