python 3.x - and - Después de instalar ROS Kinetic, no se puede importar OpenCV
opencv and ros (9)
Durante la instalación de ROS ejecutando /opt/ros/kinetic/setup.bash
, el script entre otras cosas irá a cada paquete de distribución para python2 y python3 y lo agregará a la ruta del sistema de python. Cuando intentes importar cv2
utilizando python3, primero encontrará el enlace cv2 para Python2 como se incluye en la ruta.
Si no planea usar python2.7 en absoluto para su proyecto ROS, considere eliminar completamente el paquete OpenCV de python2.7, por lo que no se agregará a la ruta cuando ejecute el script de configuración de ros:
$ rm /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
Otro enfoque más suave si planea usar ambas versiones de Python sería crear dos entornos virtuales con los enlaces correctos y activar uno u otro según sus requisitos.
Primero instalé openCV desde la fuente usando este script . Cuando lo probé estaba funcionando bien.
Después de instalar ROS kinetic , abrir python3
y ejecutar import cv2
, obtuve el siguiente error:
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
En realidad, también encuentro este problema. Acabo de comentar la fuente:
/opt/ros/kinetic/setup.bash
y luego, abra el terminal, en la ruta lib de anaconda que ejecuté:
sudo ln -sf /home/apg/miniconda3/lib/python3.6/site-packages/cv2.so /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
/home/apg/miniconda3
es la ruta donde se instaló /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
, y /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
fue la ruta en la que se instaló opencv-python
.
Todavía no sé por qué funciona este comando, pero me funcionó para resolver el problema que anteriormente no podía importar cv2.
Estaba teniendo el mismo problema exacto. El problema es que ROS crea su propio archivo cv2.so para python 2 y luego enruta cada solicitud de importación a ese archivo. Es una solución bastante fácil:
ve a la carpeta de paquetes de tu sitio
cd /usr/local/lib/python3.5/site-packages/
tenga en cuenta que, si está utilizando un entorno virtual, debe estar dentro de eso y, en su lugar, debe hacer algo como:
cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
Luego, fuerce un nuevo enlace simbólico esta vez usando la marca -f
ln -sf /usr/local/lib/python3.5/site-packages/cv2.so cv2.so
¡Y eso debería arreglar las cosas!
Intenté eliminar /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so.
Ahora está funcionando.
Parece que este problema se debe a que ROS agrega /opt/ros/kinetic/lib/python2.7/dist-packages
a la ruta python. Esto sucede cuando se activa ROS con la source /opt/ros/kinetic/setup.bash
comando source /opt/ros/kinetic/setup.bash
. Esta línea a menudo se agrega al final de su archivo /home/username/.bashrc
, en /home/username/.bashrc
.
Una solución es eliminar esta línea del archivo bashrc. De esta manera, los paquetes opthv de python3 se utilizarán correctamente, y aún puede ejecutar source /opt/ros/kinetic/setup.bash
para usar ROS. Sin embargo, esto significa que no puedes usar ROS y python3 desde el mismo entorno.
Esperemos que alguien pueda dar una mejor respuesta, pero esto debería funcionar hasta entonces.
Paso 1: Encuentra la ruta donde está instalado tu cv2.so (si usas la rueda python-cv para instalar el opencv)
Paso 2: exporta la ruta a tu archivo .bashrc o .zshrc, así:
export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-packages:$PYTHONPATH"
Gracias a Lxrd-AJ
Problema similar por aquí. Como otros sugirieron, /opt/ros/kinetic/setup.bash
agrega un camino a la apertura de ROS en la variable PYTHONPATH
.
Si está trabajando con varios virtualenv
s y necesita una solución que funcione en la mayoría de los casos, puede poner el siguiente fragmento de código en su .bashrc
:
source /opt/ros/kinetic/setup.bash
array=( $(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d) )
for i in "${array[@]}"
do
export PYTHONPATH="$i/lib/python2.7/site-packages:$PYTHONPATH"
done
Entonces, la idea es que si tiene un directorio centralizado de todos sus virtualenv
s (por ejemplo, cuando usa virtualenvwrapper
) podemos buscar esos directorios usando:
$(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d)
dado que todos nuestros virtualenv
s están bajo ~/.virtualenvs
. Esto debería darnos una lista de todos los directorios raíz de nuestro virtualenv
.
Luego, hacemos un bucle en la matriz de directorios virtualenv y estamos agregando su ruta (por ejemplo, ~/.virtualenvs/testenv/lib/python2.7/site-packages
) a PYTHONPATH
. Tenga en cuenta que esto debe hacerse justo después de la source /opt/ros/kinetic/setup.bash
.
No es una solución perfecta para el problema, ya que aún puede tener conflictos si dos envs tienen versiones opencv diferentes, pero para el problema inicial, al menos debería funcionar.
Alternativamente, puedes hacer manualmente el mismo truco para el virtualenv deseado:
export PYTHONPATH=~/.virtualenvs/testenv/lib/python2.7/site-packages:$PYTHONPATH
Si está trabajando con anaconda, active el entorno desde el que desea trabajar y elimine al culpable de sys.path
.
Para hacerlo, abre una consola de python3, desde la cual:
>>> import sys
>>> print(sys.path)
Verás varios caminos, entre los que debes notar:
''/opt/ros/kinetic/lib/python2.7/dist-packages''
Luego retíralo:
>>> sys.path.remove(''/opt/ros/kinetic/lib/python2.7/dist-packages'')
Probado con python3.5 en anaconda3 con opencv compilado localmente. Es probable que esto también sea aplicable a virtualenvs
.
Para una solución permanente, elimine la ruta ''/opt/ros/kinetic/lib/python2.7/dist-packages''
de ~/.bashrc
como se menciona en la respuesta de ''/opt/ros/kinetic/lib/python2.7/dist-packages''
.
Si ninguna de esas soluciones funciona para usted (como en mi caso), aún podría intentar engañar a su sistema para que importe el dispositivo de apertura correcto.
ros_path = ''/opt/ros/kinetic/lib/python2.7/dist-packages''
if ros_path in sys.path:
sys.path.remove()
import cv2
sys.path.append(''/opt/ros/kinetic/lib/python2.7/dist-packages'')
Tal vez podría considerar reemplazar la ruta ros python en la ubicación correcta después de importar cv2.
Parece que mi python tuvo problemas al importar el cv2 correcto aunque la ruta se configuró correctamente, probablemente debido a la extraña denominación de la biblioteca de cv2 de python3 (cv2.cpython-35m-x86_64-linux-gnu.so) en comparación con el cv2. así que tengo en /opt/ros/kinetic/lib/python2.7/dist-packages