如果使用python和子进程从pycharm进行调用,则gsutil无法正常工作,“无法导入名称_common”

Dar*_*ioB 5 python pycharm gsutil

我已经编写了python脚本来自动执行一些gsutil操作。如果我通过命令行运行,则gsutil可以正常运行。但是,如果我在python中将相同的命令翻译成子进程,则会出现错误:

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)
Run Code Online (Sandbox Code Playgroud)

我得到这个错误

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
Run Code Online (Sandbox Code Playgroud)

任何帮助

epi*_*ang 0

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

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

因此,要解决此问题,您可以通过以下命令指定cloudsdk python 二进制文件

export CLOUDSDK_PYTHON=<what-ever-python-distro-you-want>
Run Code Online (Sandbox Code Playgroud)

pyCharm 是一个无与伦比的出色工具。希望这能让一些人轻松使用这个强大的 IDE 的内置运行器/调试器。