このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

【M1 Mac】Python ScrapyがImportErrorで大ハマリ。lxmlなど環境作成し対応した件。

Python

2023.05.24

この記事は最終更新日から1年以上が経過しています。

どもです。

またまた、久々な感じです。

最近はもっぱらプログラミングは、Dart言語ばかりのコーディングだったのですが、ふとPythonのScrapyを使う機会があり、M1 Macで使用しようとしたら大ゴケして対応した話となります。

そういえば、M1Macに移行する以前は、Djangoとか扱っていたが、M1Macに移行してpython環境がスムーズに構築できなかったので諦めた覚えが。。。

 

取り敢えず、pythonの仮想環境を構築と。

python -m venv .venv
source .venv/bin/activate

 

scrapyをインストールします。

pip install scrapy

 

scrapy startprojectでテンプレート生成。

scrapy startproject xxxxx

と、エラーが発生。

ImportError: dlopen(〜〜〜〜〜/lxml/etree.cpython-310-darwin.so, ...)

長い旅路の始まりです。

 

最終的には、githubのソースよりビルドすることで解決はできました。

$ git clone https://github.com/lxml/lxml
$ cd lxml
$ git checkout tags/lxml-4.9.1
$ python setup.py bdist_wheel
$ cd dist/
$ sudo pip install lxml-4.9.1-cp310-cp310-macosx_13_0_arm64.whl

が、それまで色々と奮闘してしまいました。

まず、よく確認してみると、pyenvのpythonではなくsystemのpythonを使用していたので、pyenvで別バージョンのpythonをインストールしてみようと。

 

pyenv インストール

systemのpythonを使用していたので、pyenvで別バージョンのpythonをインストールしてみる。

pyenv install 3.10.4

 

ですが、ここでもエラー。

pyenv installで別バージョンのpythonインストールができない状態。

 

BUILD FAILED (OS X 13.2.1 using python-build 20180424)

ぬお。

python-buildバージョンがなんか古いな。と。

CommandLineToolsを削除し、再インストールを試みました。

 

sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install

インストールには時間がかかります。

 

pyenv install 3.10.4

 

もう時系列は忘れてしまったのですが。。

zlibやllvmなどもインストールし直したり。。

brew install zlib
$ echo 'export LDFLAGS="-L/usr/local/opt/zlib/lib"' >> ~/.bash_profile
$ echo 'export CPPFLAGS="-I/usr/local/opt/zlib/include"' >> ~/.bash_profile
$ echo 'export PKG_CONFIG_PATH="/usr/local/opt/zlib/lib/pkgconfig"' >> ~/.bash_profile 
$ source ~/.bash_profile

 

色々行ったにも関わらず、ビルドエラーは消えなく、

最終的に解決した内容として、pyenvを再インストールし直したらインストールできるようになりました。。

 

pyenv アンインストールしインストールし直し。

 

brew uninstall pyenv
brew install pyenv

再度、3.10.4をインストール

pyenv install 3.10.4

 

インストールしたバージョンをglobalに設定。

pyenv global 3.10.4

 

インストールしたバージョンを確認。

pyenv versions
system
* 3.10.4 (set by /Users/takayamadaisuke/.pyenv/version)

よし完璧。pythonのバージョン確認。

python --version
Python 3.9.4

ほげ。

うーん。。pyenvのpathが通っていないのかどうか。

vim ~/.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

反映

source ~/.bash_profile

と言った感じで、取り敢えずpyenvでバージョンインストールでき設定も完了しました。

python --version
Python 3.10.4

 

再度、pythonの仮想環境を作り直し、scrapy startprojectを実行。

 

scrapy startproject xxxxx

 

エラーは改善されず。。

ImportError: dlopen(〜〜〜〜〜/lxml/etree.cpython-310-darwin.so, ...)
symbol not found in flat namespace '_xsltDocDefaultLoader'

lxml自体も何度もインストールし直したり

 

$ pip uninstall lxml
$ pip install lxml

キャッシュが効いているのではと、キャッシュ無しでインストールし直したり、

pip --no-cache-dir install lxml
pip --no-cache-dir install scrapy

–no-binaryオプションでインストールし直したり、

$ pip uninstall lxml
$ pip install --no-binary lxml lxml

環境変数設定したり、

RCHFLAGS="-arch arm64" pip install lxml --compile --no-cache-dir

一向にエラーは改善されず、setuptoolsなどもインストールしてみたりと

pip install -U setuptools

なんか、色々行ったのですが駄目だったので、lxmlをソースからビルドしてみることにしました。

冒頭で記述したように、https://github.com/lxml/lxmlをクローンし、tags/lxml-4.9.1

をチェックアウト、python setup.py bdist_wheelでパッケージビルド実行。

git clone https://github.com/lxml/lxml
cd lxml
git checkout tags/lxml-4.9.1
python setup.py bdist_wheel

リリースパッケージはこちら。

https://github.com/lxml/lxml/releases

ですが、今度はpython setup.py bdist_wheelでエラーが出てしまう。。

よく見ると、brewパッケージを参照しているパスが以前のパスを参照しているくさい。

Building against libxml2/libxslt in the following directory:/usr/local/Cellar/

 

Apple Silicon版のHomebrewは /opt/homebrewを利用する形となっているので、/usr/local/Cellar/は必要ないはず。だけど以前のMacよりそのまま移行したせいか、いっぱいある。

思い切って削除してみました。

sudo rm -fr /usr/local/Cellar/

 

再度libxml2をインストールし直し、

brew uninstall libxml2
brew install libxml2

 

パスも通す。

export PATH="/opt/homebrew/opt/libxml2/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/libxml2/lib"
export CPPFLAGS="-I/opt/homebrew/opt/libxml2/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/libxml2/lib/pkgconfig"

参照しているパスは変更されたものの、まだ依然としてエラーが発生する状態。

 

Building against libxml2/libxslt in the following directory: /opt/homebrew/Cellar/libxml2/2.11.4/lib
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --help
error: invalid command 'bdist_wheel'

 

うーん。もう少しだと思うが。Cythonが必要ぽいのでインストール。

pip install Cython

wheelパッケージも必要そうなのでインストール。

pip install wheel

再度実行。

python setup.py bdist_wheel

ついに成功。

dist以下にビルド成果物が生成されますので、そちらをインストール。

cd dist/
sudo pip install lxml-4.9.1-cp310-cp310-macosx_13_0_arm64.whl

と、最終的にソースからビルドを行うことによって、M1 Macでも、Python Scrapyパッケージを使用することができました。

長かった。。

 

最終的なlxmlのインストール方法。

git clone https://github.com/lxml/lxml
cd lxml
git checkout tags/lxml-4.9.1
python setup.py bdist_wheel
cd dist/
sudo pip install lxml-4.9.1-cp310-cp310-macosx_13_0_arm64.whl

 

 

Comment

Related Article

【M1 Mac】Python ScrapyがImportErrorで大ハマリ。lxmlなど環境作成し対応した件。

2023.05.24

Django (DRF)で、ユーザーのモデルを作成時にハッシュidを別で保存する。

2020.09.10

macOS pyenv環境でtkinterが動かないので、再度インストール

2020.08.09

Django django-rest-auth + Nuxt.js auth-module で作る SPA JWT OAuth ログインシステム その3

2020.06.14

Django django-rest-auth + Nuxt.js auth-module で作る SPA JWT OAuth ログインシステム その2

2020.06.08

Django django-rest-auth + Nuxt.js auth-module で作る SPA JWT OAuth ログインシステム その1

2020.06.07

Django django-allauthで、サクッとソーシャルログイン機能を実装

2020.04.12

PythonでGUIアプリ開発「PyQt」を使った感想

2019.07.18

CATEGORY LIST

LATEST NEWS

Mac VSCodeで、SFML C++開発環境を作る。

C++

2024.09.09

Rust-SDL2 examplesをすべて試す

Rust

2024.09.01

JavaScriptで、DOMを放り投げる処理

JavaScript

2024.07.27

Rustで創る MOS 6502 CPU その2

Rust

2024.07.23

Rustで創る MOS 6502 CPU その1

Rust

2024.07.19

汎用 3D mesh/model viewerを求め。と、簡単に、FBXファイルをglTF(glb)に変換ツールを求め。

C++

2024.06.06

M1 Macで、OpenGL GLUTを使ってコンパイルする

C

2024.04.27

Rust - Actix Web mongo ユーザー登録 JWT認証

Rust

2024.03.24

Rust - Actix Web JWT 認証認可 APIの作成

Rust

2024.02.25

Rust - Actix Web × JSON 静的ファイルをAPIで返却

Rust

2024.01.19

Rust - Actix Web × MongoDB環境をサクッと起動

Rust

2024.01.18

5分で学ぶ RustでWave Function Collapse (波動関数崩壊アルゴリズム)

Rust

2024.01.15

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US