Python3:ImportError:モジュールマルチプロセッシングの値を使用すると、「_ ctypes」という名前のモジュールはありません


127

Ubuntuを使用していて、Python 2.7.5および3.4​​.0をインストールしています。Python 2.7.5では変数を正常に割り当てることができますx = Value('i', 2)が、3.4.0ではできません。私は得ています:

Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/usr/local/lib/python3.4/multiprocessing/context.py", line 132, in Value
      from .sharedctypes import Value
   File "/usr/local/lib/python3.4/multiprocessing/sharedctypes.py", line 10, in <
module>
   import ctypes
   File "/usr/local/lib/python3.4/ctypes/__init__.py", line 7, in <module>
      from _ctypes import Union, Structure, Array
ImportError: No module named '_ctypes'

3.4.0のソースをインストールして3.3.2にアップデートしました。/usr/local/lib/python3.4にインストールされています。

Python 3.4に正しく更新しましたか?

Python 3.4はusr / local / libにインストールされていますが、Python 3.3.2はusr / libにインストールされているので、上書きされなかったことに気付きました。


「3.4.0のソースをインストールする」の間に何かが汚されたようです。それはどういう意味ですか?そのコマンドは3.3.2で機能しましたか?
Mechanical_Meat

sudo make installコマンドを使用して、ソースコードからインストールしました。はいマルチプロセッシングからの値のインポートは3.3.2で機能しました
htc_m8 '19年

8
_ctypeslibffi-dev依存関係が利用できなかったため、ビルドされませんでした。代わりにdeadsnakes PPAの使用を検討してください。
Eryk Sun 2014

11
libffi-devをインストールしてpython3.4を再インストールすると、問題が修正されました
htc_m8 '19年

回答:


226

libffi-devpython3.7をインストールして再インストールすると、問題が解決しました。

py 3.7をきれいにビルドするために libffi-dev 必要です、そうでなければそれ以降のものが失敗します

RHEL / Fedoraを使用している場合:

yum install libffi-devel

または

sudo dnf install libffi-devel

Debian / Ubuntuを使用している場合:

sudo apt-get install libffi-dev

35
インストールしましたlibffi-devが、まだこのエラーが発生します
tushar_ecmc

2
Linuxを使用している場合は、実行ldconfigして新しいをロードしlibffi.soます。の主な目的は、@ tushar_ecmcで確認できるapt-get install libffi-devという名前のファイルをインストールすることですlibffi.sodpkg -L libffi-dev
Ben-xue

14
独自のPythonディストリビューション(たとえばpyenv install)をコンパイルした場合は、パッケージのインストール後にディストリビューションを再コンパイルする必要があります。
ネニング

121

新しいDebianイメージで、https//github.com/python/cpythonを複製して実行します。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
sudo apt-get install libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install libffi-dev

次に、configure上記でクローンしたファイルを実行します。

./configure
make # alternatively `make -j 4` will utilize 4 threads
sudo make altinstall

3.7がインストールされて動作します。

わずかな更新

私はこの回答をもう少し説明して更新すると言ったように見えますが、2年後には追加するものはあまりありません。

  • このSOの投稿では、のような特定のライブラリpython-devが必要になる理由について説明しています。
  • このSOの投稿では、makeコマンドで引数altinstallとしてasを使用するのはなぜかについて説明していinstallます。

それとは別に、満たす#include必要のあるディレクティブを探すためにcpythonコードベースを読むか、どちらかを選択することを選択します。成功します。

車が丘を転がるエンジニア、マネージャー、プログラマーの話を思い出します。


3
素晴らしい。では、どうやって上のリストを手に入れたのか教えて頂けますか?試行錯誤で?:-O
Veky

4
正直なところ、@ Veky私は「ImportError: '_ctypes'という名前のモジュールはありません」というエラーをウェブで検索しましたが、機能する前にいくつかのことを試しました。回答を更新して、APT、Python、makeなどの理解が不十分であることを明確にする
MikeiLL 2017年

python3-dev代わりにすべきですpython-devpython-devのようですpython2
Timo

なぜソースコードリポジトリを複製して使用するのsudo apt-getですか?それだけでは意味がありません。sudo apt-getはすでにコンパイルされたコードのダウンロードを処理するので、なぜコードをダウンロードして使用しないのですか
ライアン

1
@MikeiLL私は、すべてのsudoステートメントが、ダウンロードしたソースコードをビルドするための前提条件をインストールしていることに気付きました。./configureそしてmakeものはそれらのものをインストールする必要があります。
ライアン

29

pyenvを使用して、Debian / Raspbian / Ubuntuで「私は、「_ ctypes」という名前のモジュールがありません」というエラーが表示される場合は、次のコマンドを実行する必要があります。

sudo apt-get install libffi-dev
pyenv uninstall 3.7.6
pyenv install 3.7.6

3.7.6の代わりにPythonのバージョンを置く


スタックオーバーフローへようこそ。詳細情報を提供できますか?リファレンスなど、stackoverflow.com
help / how-to-answer

答えてくれてありがとう、最高の投票数には私が必要とする可能性のある完全なリストがありましたが、pyenv実際に機能させるためにviaを再インストールする必要がありました。pyenvを使用すると、ソースコードを取得してすべてのmakeことを確実に行うよりもはるかに簡単です。
dragon788

これはUbuntuではうまくいきました。シンプルで効果的。
Phil

ありがとう、それは役に立ちました。pyenv訪問のための前提条件の完全なリストについてはgithub.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
パヴェル・ミュシャ

最初にPythonをアンインストールする必要はありません。それをもう一度インストールするだけで、Pythonバイナリが再コンパイルされ、それが必要です。
RusI

22

CentOSまたは任意のRedhat LinuxマシンにPython 3.7をインストールする詳細な手順:

  1. https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xzからPythonをダウンロードします
  2. 新しいフォルダにコンテンツを抽出します
  3. 同じディレクトリでターミナルを開く
  4. 以下のコードをステップごとに実行します。
sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 
./configure
make
make install

14

Centosのインストールを追加すると思いました。

sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 

Pythonのバージョンを確認します。

python3 -V

virtualenvを作成します。

virtualenv -p python3 venv


2
これは低品質のフラグが立てられており、レビューキューで確認しています。それは実際には独立した答えとしては機能しません。削除をお勧めしますが、拡張することで改善できるでしょうか?
dbliss 2017年

11

次のコマンドを使用して、Ubuntu 18.04にPython 3.7.3をインストールしようとしたときに、このエラーに遭遇しました$ pyenv install 3.7.3。実行後にインストールは成功しました$ sudo apt-get update && sudo apt-get install libffi-devここで提案されています)。問題はそこで解決されました


6

どのソリューションも機能しませんでした。もう一度pythonを再コンパイルする必要があります。必要なパッケージがすべて完全にインストールされたら。

これに従ってください:

  1. 必要なパッケージをインストールする
  2. 走る ./configure --enable-optimizations

https://gist.github.com/jerblack/798718c1910ccdd4ede92481229043be


2
実は素晴らしい答えです。誰もがあなたがlibffi-develを必要とし、それがそれを解決するだろうと言っています、問題はあなたがpythonを再コンパイルする必要もあるということです。私はalsmotがlibffiをあきらめました。
Aleksander Fular

3

libffiのカスタマイズされたインストールについては、このスレッドを参照しください。Python3.7がlibffiのライブラリーの場所を見つけるのは困難です。別の方法はCONFIGURE_LDFLAGS、Makefileで変数を設定することです(例:)CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64"


リンクが壊れています。ここに示すように、Makefileで変更を加えようとしましたが、機能しませんでした。_ctypesはまだビルドされていません。
user5915738

2

私の解決策:apt-getでlibffi-devをインストールしても役に立たなかった。しかし、これは役に立ちました:ソースからlibffiをインストールしてから、ソースからPython 3.8をインストールします。

私の構成:Ubuntu 16.04 LTS Python 3.8.2

ステップバイステップ:

Visual Studio Codeからデバッガーを起動したとき、およびを実行しpython3 -c "import sklearn; sklearn.show_versions()"たときに、「ModuleNotFoundError: '_ctypes'という名前のモジュールはありません」というエラーメッセージが表示されました。

  • https://github.com/libffi/libffi/releasesからlibffi v3.3をダウンロードします
  • libtoolのインストール:sudo apt-get install libtool libffiのREADME.mdファイルには、autoconfとautomakeも必要であると記載されています。それらはすでに私のシステムにインストールされています。
  • ドキュメントなしでlibffiを構成します。

./configure --disable-docs

make check

sudo make install

その後、私のpythonインストールは_ctypesを見つけることができました。


2

これにより、Debianでの私と同じエラーが解決されました。

sudo apt-get install libffi-dev

そして再びコンパイルする

リファレンス:issue31652


0

Minicondaを使用してもかまわない場合は、必要な外部ライブラリと_ctypesがデフォルトでインストールされます。それはより多くのスペースを必要とし、適度に古いバージョンのPythonを使用する必要があるかもしれません(たとえば、この執筆時点では3.8.2ではなく3.7.6)。


0

不足しているphp3(Python3)モジュールをパッケージマネージャーからロードする必要があります。あなたがUbuntuを持っているなら私はお勧めしSynaptic Package Managerます:

sudo apt-get install synaptic

そこで、不足しているモジュールを簡単に検索できます。ctypesを検索し、すべてのパッケージをインストールします。次に、Pythonディレクトリに移動して、

./configure
make install.

これで問題が解決するはずです。


0

私も同じ問題を抱えていました。上記の解決策のどれも私にとってうまくいきませんでした。重要な課題は、ルートアクセス権がないことです。そこで、まずlibffiのソースをダウンロードします。次に、通常のコマンドでコンパイルしました。

./configure --prefix=desired_installation_path_to_libffi
make 

それから私は使用してpythonを再コンパイルしました

./configure --prefix=/home/user123/Softwares/Python/installation3/  LDFLAGS='-L/home/user123/Softwares/library/libffi/installation/lib64'
make 
make install

私の場合、「home / user123 / Softwares / library / libffi / installation / lib64」は、libffi.soが配置されているLIBFFIインストールディレクトリへのパスです。また、/ home / user123 / Softwares / Python / installation3 /は、Pythonインストールディレクトリへのパスです。必要に応じて変更してください。


-1

あなたが何かをしている場合、「あなたはそれを間違った方法でやっている」ので誰もあなたの言うことを聞きませんが、あまりにも理由があって「間違った方法」でそれをしなければなりません(例えば、私の場合、すぐにファウルに劣化します)開発チームの太りすぎの母親の誰かについての言葉)、あなたは最初にする必要があります:

libffiを入手して、通常の方法でユーザーのインストール領域にインストールします。

git clone https://github.com/libffi/libffi.git
cd libffi
./configure --prefix=path/to/your/install/root
make
make install

次に、Python 3ソースに戻り、コードのこの部分を、Pythonソースディレクトリの最上位にあるsetup.pyで見つけます。

        ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
        if not ffi_inc or ffi_inc[0] == '':
            ffi_inc = find_file('ffi.h', [], inc_dirs)
        if ffi_inc is not None:
            ffi_h = ffi_inc[0] + '/ffi.h'
            if not os.path.exists(ffi_h):
                ffi_inc = None
                print('Header file {} does not exist'.format(ffi_h))
        ffi_lib = None
        if ffi_inc is not None:
            for lib_name in ('ffi', 'ffi_pic'):
                if (self.compiler.find_library_file(lib_dirs, lib_name)):
                    ffi_lib = lib_name
                    break

        ffi_lib="ffi"  # --- AND INSERT THIS LINE HERE THAT DOES NOT APPEAR ---
        if ffi_inc and ffi_lib:
            ext.include_dirs.extend(ffi_inc)
            ext.libraries.append(ffi_lib)
            self.use_system_libffi = True

上記でマークした行にコメントを追加します。なぜそれが必要なのか、そしてLinuxプラットフォームで '--without-system-ffi`を尊重するように構成を取得する方法がないのはなぜか、それが今後数時間で「サポートされない」理由を見つけますが、すべてがそれ以来働いた。それ以外の場合は、幸運を祈ります... YMMV。

何をするか:そこにあるロジックをオーバーライドし、コンパイラリンクコマンドに「-lffi」を追加させるだけです。ライブラリをユーザーがインストールした場合は、includeがPKG_CONFIG_PATH含まれている限り、おそらくヘッダーが正常に検出されていますpath/to/your/install/root/lib/pkgconfig

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.