Importer vtk avec brew python

Dans la situation en utilisant python sur homebrew

$ brew install --python --qt vtk

Puis

import vtk
# => Fatal Python error: PyThreadState_Get: no current thread. Abort trap: 6

Sera.

C'est comme mentionné dans le numéro homebrew-science OSX dans * .dylib et * .so qui vient avec l'installation de brew En effet, le chemin Python côté système est intégré.

Essayez otool -L (les outils de ligne de commande Xcode sont nécessaires pour utiliser otool et install_name_tool)

$ otool -L /usr/local/Cellar/vtk/7.0.0_3/lib/libvtkCommonCorePython27D-7.0.dylib
/usr/local/Cellar/vtk/7.0.0_3/lib/libvtkCommonCorePython27D-7.0.dylib:
	/usr/local/opt/vtk/lib/libvtkCommonCorePython27D-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/Cellar/vtk/7.0.0_3/lib/libvtkWrappingPython27Core-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/Cellar/vtk/7.0.0_3/lib/libvtkCommonCore-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.10)
	/usr/local/Cellar/vtk/7.0.0_3/lib/libvtksys-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

Comme vous pouvez le voir, le lien vers /System/Library/Frameworks/Python.framework/Versions/2.7/Python est intégré. Pour résoudre ce problème, utilisez install_name_tool

$ sudo install_name_tool -change /System/Library/Frameworks/Python.framework/Versions/2.7/Python /usr/local/Cellar/python/2.7.11/Frameworks/Python /usr/local/Cellar/vtk/7.0.0_3/lib/libvtkCommonCorePython27D-7.0.dylib

Courez. (Sudo est requis pour la réécriture) Quand je le vérifie,

$ otool -L /usr/local/Cellar/vtk/7.0.0_3/lib/libvtkCommonCorePython27D-7.0.dylib
/usr/local/Cellar/vtk/7.0.0_3/lib/libvtkCommonCorePython27D-7.0.dylib:
	/usr/local/opt/vtk/lib/libvtkCommonCorePython27D-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/Cellar/vtk/7.0.0_3/lib/libvtkWrappingPython27Core-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/Cellar/vtk/7.0.0_3/lib/libvtkCommonCore-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/Cellar/python/2.7.11/Frameworks/Python (compatibility version 2.7.0, current version 2.7.10)
	/usr/local/Cellar/vtk/7.0.0_3/lib/libvtksys-7.0.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

Vous pouvez voir que le lien peut être modifié vers le chemin de brew python. Ce n'est pas celui-ci qui doit être changé, mais __ / usr / local / lib / python2.7 / site-in en plus de __ / usr / local / Cellar / vtk / {version} /lib/*.dylib__ Étant donné que les packages / vtk / vtk * .so__ doivent également être modifiés, j'ai écrit le script suivant.

vtk_fix_pythonpath.sh


#!/bin/sh

SystemPythonPath=/System/Library/Frameworks/Python.framework/Versions/2.7/Python #Changer en fonction de la version de python que vous utilisez
BrewPythonPath=/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Python #Changer en fonction de la version de python que vous utilisez

function replace_system_python() {
    echo " -- before -- "
    otool -L $1
    install_name_tool -change ${SystemPythonPath} ${BrewPythonPath} $1
    echo " -- after -- "
    otool -L $1
}

for file in `find /usr/local/lib/python2.7/site-packages/vtk/vtk*.so`;do
    replace_system_python ${file}
done

for file in `find /usr/local/Cellar/vtk/7.0.0_3/lib/*.dylib`;do
    replace_system_python ${file}
done

C'est une mauvaise manière d'exécuter install_name_tool -change pour tous les fichiers dylib, donc les fichiers (même ceux qui n'incluent pas le chemin Python), mais cela ne devrait pas être un problème car il ne sera pas remplacé à moins qu'il ne corresponde.

$ sudo ./vtk_fix_pythonpath.sh

Après cela, si vous vérifiez si vous pouvez importer,

import vtk
# => No error!!!!!!

J'ai pu importer sans aucun problème. Si vous lisez le problème de la science à domicile, il semble que certaines personnes aient écrit un correctif qui peut construire vtk sans incorporer de liens, mais voulez-vous toujours corriger le corps principal?

Recommended Posts

Importer vtk avec brew python
Importer tsv avec Python
Travailler avec LibreOffice en Python: import
Statistiques avec python
Importer le module Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Importer un script python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Synthétiser l'importation Python
Cast avec python
Python> Exécuter avec des arguments d'exécution> Utiliser import argparse
Enquête lorsque l'importation ne peut pas être effectuée avec python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Communication série avec python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Python depuis ou import
importation du module d'origine python
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Pensez à yaml avec python
Utiliser Kinesis avec Python
Premiers pas avec Python
Utiliser DynamoDB avec Python
Getter Zundko avec python
Gérez Excel avec python
Loi d'Ohm avec Python
Jugement des nombres premiers avec python
Exécutez Blender avec python