1. ホーム

Anacondaフラッシュバック問題 AttributeError: 'str' オブジェクトには 'get' 属性がない

2022-02-28 03:45:11

今日、なぜか突然anaconda-navigatorのインターフェースが起動せず、フェードアウトしてしまい、プロンプトで開くと以下のようなエラーが発生します。

アナコンダナビゲーター
2019-03-01 20:27:19,492 - ERROR download_api._get_url:416
期待値:1行目1列目(char 0)

トレースバック (最も最近の呼び出し):
  ファイル "d:\Anaconda3⇄site-packages⇄anaconda_navigator⇄widgets_main_window.py", 行 539, in setup
    self.post_setup(conda_data=conda_data)
  File "d:\Anaconda3_lib⇄PackagesⒸAnaconda_navigatorⒸWidgetsⒸMain_window.py", line 576, in post_setup
    self.tab_home.setup(conda_data)を実行します。
  File "d:\Anaconda3_lib⇄Packages⇄anaconda_navigatorⒸWidgetsⒸtabsⒸhome.py", line 169, in setup
    self.set_applications(アプリケーション、パッケージ)
  ファイル "d:\Anaconda3_lib⇄Packages⇄anaconda_navigatorⒸWidgetsⒸhome.py", 行 204, in set_applications
    apps = self.api.process_apps(applications, prefix=self.current_prefix)
  ファイル "d:\Anaconda3﹑Site-packages﹑anaconda_navigator.py", line 888, in process_apps
    versions=[vsdata.get('productVersion')]です。
AttributeError: 'str' オブジェクトには 'get' という属性がありません。

これは本当におかしいので、元のコードを開いて見てみると、vsdataのバージョンに関する情報がないので、この時点ではvsdataは何か問題があってアクセスできないはずであり

d:\Anaconda3lib⇄site-packages⇄anaconda_navigatorapi.py", line 888 reads


        if not vscode_conda_package_exists:
            if apps_vscode_enable and self.is_vscode_available():
                vsdata = self.vscode_application_data() # Check vscode version
                app = GLOBAL_VSCODE_APP
                display_name = 'VS Code'
                # print("vsdata", vsdata)

                applications[app] = dict(
                    name=app,
                    display_name=display_name,
                    description=APPS_DESCRIPTIONS[app],
                    versions=[vsdata.get('productVersion')],
                    command=self._VSCODE_EXE,
                    image_path=image_paths[app],
                    needs_license=False,
                    non_conda=True,
                )


そして、この行に沿ってvscode_dataを調べ、次のようにプリントコードを1行追加しました。

def vscode_application_data(self):
        """Get vscode data from microsoft rest api."""
        data = {}
        url = self._VSCODE_ENDPOINT
        print("vscode endpoint url:", url) //I added the debug code
        if url:
            data = self._download_api.get_url(
                url=url,
                as_json=True,
                non_blocking=False,
            )
        return data

プリントを求めた結果は次のようになります。

vscode エンドポイント url: https://update.code.visualstudio.com/api/update/win32-x64-user/stable/version

確認したところ、このURLは現時点では無効で、vscodeの公式サイトに本日問題が発生し、vscodeにアクセスできず、使用できない状態になっているということです。

原因をまとめると

anaconda-navigatorが起動しない原因は、vscodeサイトにアクセスできないことです(anaconda-navigatorインターフェイスのvscodeアイコンを起動できない)。

回避策

具体的にはどうすればいいかわからなかったので、単純にコメントアウトした段落に

"""
        if not vscode_conda_package_exists:
            if apps_vscode_enable and self.is_vscode_available():
                vsdata = self.vscode_application_data() # Check vscode version
                app = GLOBAL_VSCODE_APP
                display_name = 'VS Code'
                # print("vsdata", vsdata)

                applications[app] = dict(
                    name=app,
                    display_name=display_name,
                    description=APPS_DESCRIPTIONS[app],
                    versions=[vsdata.get('productVersion')],
                    command=self._VSCODE_EXE,
                    image_path=image_paths[app],
                    needs_license=False,
                    non_conda=True,
                )
"""

さて、ここで問題です!anacondaは正常に起動しますが、vscodeはまだGUIに表示されないので、このままにしておきましょう!。こういうギスギスした質問は嫌いです、時間がかかる!

では、特定の環境でvscodeを起動するにはどうすればいいかというと、例えばtorchという環境を起動したい場合、次のようにします。

Anaconda Prompt ===>>> conda activate torch ===>>> code (vscodeの起動、通常はインストールディレクトリが自動的に認識されますが、見つからない場合は検索してください。)

インターフェースに入った後、vscode のターミナルを起動し、conda activate torch も実行します。"conda activate torch" というフレーズが二度書かれていますが、実際には Anaconda Prompt でも vscode のターミナルでも一度だけ実行すれば効果は同じです。

唯一残念なのは、anacona-navigatorのGUIでvscodeを起動できないことです。

続いて、通常時の様子

もちろん、次の日にvscodeのウェブサイトにアクセスできることがわかったら、コメントしたコードをうまく元に戻せば、すべてが元通りになります!!!!

この時点で、アクセス可能なvsdataをプリントアウトすると、以下のようになります。

vscode エンドポイント url: https://update.code.visualstudio.com/api/update/win32-x64-user/stable/version

vsdata {'url': 'https://vscode.cdn.azure.cn/stable/1b8e8302e405050205e69b59abb3559592bb9e60/VSCodeUserSetup-x64-1.31.1.exe', 'name': ' 1.31.1', 'version': '1b8e8302e405050205e69b59abb3559592bb9e60', 'productVersion': '1.31.1', 'hash': ' 43c2aecb9e1d65759dbe11ee5cb62030a2d06567', 'timestamp': 1549938223872, 'sha256hash': ' f213ab6f6646bd80b0606e3d52db9219eb539f586779720e52ed12b9d9732fb1', 'supportsFastUpdate': True} です。

vscodeのネットワーク問題を回避したい場合は、上記のコードのバージョン情報を変更し、vscodeが更新をチェックしないようにすることができます。

Change the
versions=[vsdata.get('productVersion')],
to
versions=["1b8e8302e405050205e69b59abb3559592bb9e60"],