如果使用 python 和子进程从 pycharm 调用 gsutil 不起作用,“无法导入名称 _common”

Posted

技术标签:

【中文标题】如果使用 python 和子进程从 pycharm 调用 gsutil 不起作用,“无法导入名称 _common”【英文标题】:gsutil not working if calling from pycharm with python and subprocess, "cannot import name _common" 【发布时间】:2019-10-04 14:26:22 【问题描述】:

我编写了一个 python 脚本来自动化一些 gsutil 操作。 如果我通过命令行运行 gsutil 可以正常工作。但是如果我在 python 中用 subprocess 翻译相同的命令,我会得到一个错误:

BUCKET_NAME = 'datastore-backup'
FOLDER_NAME = 'my_folder'

gcs_path = os.path.join('gs://', BUCKET_NAME, FOLDER_NAME)

files = subprocess.check_output(['gsutil', 'ls', gcs_path], stderr=sys.stdout)
print(files)

我收到此错误

Traceback (most recent call last):
  File "/Users/dario/Downloads/google-cloud-sdk/bin/bootstrapping/gsutil.py", line 13, in <module>
    import bootstrapping
  File "/Users/dario/Downloads/google-cloud-sdk/bin/bootstrapping/bootstrapping.py", line 32, in <module>
    import setup  # pylint:disable=g-import-not-at-top
  File "/Users/dario/Downloads/google-cloud-sdk/bin/bootstrapping/setup.py", line 55, in <module>
    from googlecloudsdk.core import properties
  File "/Users/dario/Downloads/google-cloud-sdk/lib/googlecloudsdk/core/properties.py", line 34, in <module>
    from googlecloudsdk.core.util import times
  File "/Users/dario/Downloads/google-cloud-sdk/lib/googlecloudsdk/core/util/times.py", line 55, in <module>
    from dateutil.tz import _common as tz_common
ImportError: cannot import name _common

任何帮助

【问题讨论】:

我尝试在 Google Cloud Shell 中运行您的代码,但无法复制错误。它似乎与您的 Python 环境有关,而不是与 Google Cloud Platform 或 gsutil 命令有关。我已经看到在 PyCharm 中运行代码时出现此错误。您能否确认您是否确实尝试在 PyCharm 中运行它?如果是这样,请检查this,它可能会有所帮助。 是的,我在 pycharm 中运行它.....按照建议的解决方案,盒装已经打勾,没有运气...... 我建议您更改问题的标签,因为这不是 Google Cloud Platform 问题,只要 gsutil 命令从您的命令行运行且没有错误。这样,您的问题将吸引到更适合回答它的人。你也可以在 PyCharm 社区中搜索/发帖 here ImportError when running dev_appserver.py from pycharm的可能重复 【参考方案1】:

我已经彻底解决了这个问题。问题的根源是当您调用subprocess.checkos.system( 时,gsutil cli 将使用错误的 python。

在我的例子中,gsutil 使用一个系统 python 二进制文件 2.7。我通过在/Users/dario/Downloads/google-cloud-sdk/lib/googlecloudsdk/core/util/times.py 中插入print(tz) 语句发现了这个问题。事实证明,它正在加载一个 Python2.7/site-packages 版本的 dateutil。

所以要解决这个问题,您可以通过以下方式指定 clouddk python 二进制文件

export CLOUDSDK_PYTHON=<what-ever-python-distro-you-want>

pyCharm 是首屈一指的绝妙工具。希望这能让一些人轻松使用这个强大的 IDE 的内置运行器/调试器。

【讨论】:

以上是关于如果使用 python 和子进程从 pycharm 调用 gsutil 不起作用,“无法导入名称 _common”的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 Python 的 7-zip cmd 行和子进程

PoolProcessExecutor 和子进程 Python

在 PyCharm 中使用子进程执行 sudo 命令

python 多进程和子进程1

Python中主进程和子进程之间的动态通信

节点 Kue 和子进程 - 从生成的进程中获取错误