web-dev-qa-db-ja.com

Linux上のPython3.6でのトレースバックのModuleNotFoundError

I buntu 16.04にインストールされたPython 3.6 を使用して Jonathon FernyhoughのPPA

Sudo add-apt-repository ppa:jonathonf/python-3.6
Sudo apt-get update
Sudo apt-get install python3.6

新しいリテラル文字列補間を使用して文字列を作成しましたが、無効な形式指定子を指定しました。期待通りのValueError: Invalid format specifierだけでなく、予期しないModuleNotFoundError: No module named 'apt_pkg'

$ python3.6
Python 3.6.0 (default, Dec 29 2016, 21:40:36) 
[GCC 5.4.1 20161202] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> value = 4 * 20
>>> f'the value is {value:%A}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier

これを Pythonバグトラッカー に報告しました。そこでは次のことに注意されました:

CPython自体ではなく、ベンダーの問題のようです。この同じ問題は、Ubuntu 16.10のPython 3.6でも発生します。例外を発生させると、これが発生する可能性があります。

Python 3.6.0b2 (default, Oct 11 2016, 05:27:10) 
[GCC 6.2.0 20161005] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> raise Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception
>>> 

https://bugs.launchpad.net/ubuntu/+source/python3.6/+bug/1631367 も参照してください。

最後に、問題はコメントでクローズされました

はい、これはベンダーの障害報告インフラストラクチャであり、障害が発生しているようです。インタラクティブプロンプトですべてのトレースバックのレポートが必要な理由は私にはわかりませんが、それは彼らがやろうとしていることのようです。

私の質問は次のとおりです。

  1. このコメントをどのように解釈しますか?この場合、ベンダーはJonathon FernyhoughのPPAですか?そして、彼は、トレースバックを生成するすべての例外のレポートをファイルしようとするために、彼が配布するPythonコードに何かを変更しましたか?
  2. この問題を解決するには、誰に通知する必要がありますか、どこにバグを報告する必要がありますか?
12
BioGeek

この質問をStackoverflowに投稿した後、Barry A. Warsawは次のようにしました comment issue tracker

ランダムPPAからPython 3.6をインストールすると、notはこのバージョンのインタープリターを完全にサポートします。 Python 3.6は、Ubuntuのどのバージョンでもまだサポートされているバージョンではありません(これを使用していると想定しています)。

多くの場合、新しいPython 3インタープリターパッケージをインストールできます。Ubuntuインフラストラクチャは、インストールされているすべてのPython 3's技術的に言えば、それらはすべてsys.pathに/ usr/lib/python3/dist-packagesを持つため、Python 3のサポートバージョン用に構築されたサードパーティのpure-Pythonモジュールがインポート可能になりますPython 3。

しかし、その1)は、それらのサードパーティのモジュールが機能すると言うことからは程遠いものです。 2)notには、特定のインタープリターバージョン用に再構築する必要があるC拡張モジュールを含むパッケージが含まれます。

Pythonの新しいバージョンをサポートするのは長いプロセスです。そのための作業はまだ始まったばかりです。詳細については、ubuntu-devel @ ubuntu.comに連絡してください。

Ubuntuは、標準の例外ハンドラーをインストールするため、Pythonアプリケーションとそのようなクラッシュが発生した場合、クラッシュ統計を収集できるため、一般的な問題とリグレッションの修正にリソースを充てることができます。トレースバック)は、クラッシュレポートインフラストラクチャです。apportは(C++)拡張モジュールであるapt_pkgを呼び出すため、Python 3.6のPPAからインストールしたバージョンではビルドされません。もちろん、PPAの所有者(私は知らない)もアーカイブ全体をPython 3再構築しました。私はそれを設定しているので、かなり手間がかかりますが、このかなりランダムなPPAに対して行われたとは思えません。

Ubuntu-develメーリングリストは、UbuntuでサポートされるバージョンとしてPython 3.6をもたらすための進行中の作業について議論するのに適した場所です。

13
BioGeek

最初にPython 3のpython-aptパッケージをインストールすることで、Python 3.6のこの問題を解決しました。

Sudo apt install python3-apt

その後、dist-packagesディレクトリに変更し、apt_pkg[...].soファイルを新しいデフォルトのファイル名apt_pkg.soにコピーし、Python 3.6でも認識されるようにしました。

cd /usr/lib/python3/dist-packages
Sudo cp apt_pkg.cpython-34m-i386-linux-gnu.so apt_pkg.so

予想されるスローされたエラーメッセージで、すべてのModuleNotFoundError: No module named 'apt_pkg'例外が消えました。

26
andreas

ほとんどの回答がうまくいかない場合は、以下の手順を試してください([version])を変更する必要があることに注意してください。

  1. このコマンドを実行しますSudo apt install python3-apt
  2. ディレクトリcd /usr/lib/python3/dist-packagesに移動します
  3. lsを実行してapt_pkg.cpython-[version]-i386-linux-gnu.soの正しいバージョンを見つけます。私の場合は35mでした
  4. シンボリックリンクを作成Sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so忘れないでください:あなたの[バージョン]を入力してください

トラブルシューティング

エラーcp: cannot stat 'apt_pkg.cpython-[your-version]-i386-linux-gnu.so': No such file or directoryが表示された場合、以下のコマンドを試してください。

  1. rm -rf apt_pkg.so
  2. シンボリックリンクを作成Sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so忘れないでください:あなたの[バージョン]を入力してください