7

Próbowałem zainstalować OpenCV w środowisku Bash w systemie Windows (podsystem systemu Windows dla systemu Linux, wsl) i okazało się to bardzo trudne.Błąd Python3.4 - Nie można włączyć stosu wykonywalnego, ponieważ obiekt udostępniony wymaga: Nieprawidłowy argument

Chyba już bardzo blisko, ale po wejściu do pytona, import cv2 daje następujący błąd:

ImportError: libopencv_core.so.3.1: cannot enable executable stack as shared object requires: Invalid argument 

Jak włączyć bibliotekę wykonać na stosie?


Moi OpenCV *opencv*.so* pliki bibliotek znajdują się w /usr/local/lib/. W normalnym środowisku Linux, chciałbym udzielić tych bibliotek możliwość wykonywania na stosie przy użyciu

execstack -c /usr/local/lib/*opencv*.so* 

Jednak chociaż można pomyślnie pobrać pakiet execstack, że nie jest to uznawane polecenia można uruchomić w celu umożliwienia wykonanie na stosie. Podejrzewam, że ma to coś wspólnego z Zapobieganiem Realizacją Danych, wersją Exec-Shield w Window, aby zapobiec atakom na stosy.

Ale może byłem zbyt blisko problemu, aby dowiedzieć się, co jest nie tak. Dlaczego nie mogę zaimportować tego pakietu Pythona? Używam Python v3.4 i OpenCV skompilowany z latest source code (v.3.1).

+0

W execstack: Musisz uruchomić go jako root, ponieważ znajduje się wewnątrz sbin. To nie pomaga jednak w kwestii OpenCV. – Emiswelt

Odpowiedz

23

I rozwiązać ten problem następujący sposób: tatsuya-y.hatenablog.com

używam Windows bash i zainstalować OpenCV przez conda install -c menpo opencv3=3.1.0 wtedy mam ten (Python 2.7) >>>import cv2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: libopencv_ccalib.so.3.1: cannot enable executable stack as shared object requires: Invalid argument

go rozwiązać przez execstack polecenia

sudo apt-get install execstack 
sudo execstack -c $HOME/anaconda2/lib/libopencv_* 

Następnie sudo apt-get install gtk2.0-0 Problem rozwiązany!>>> cv2.__version__ '3.1.0'

Pamiętaj, że biblioteki opencv są instalowane w/usr/local/lib, jeśli postępujesz zgodnie z instrukcjami instalacji online. Tak więc polecenie będzie:

sudo execstack -c /usr/local/lib/libopencv_* 
+1

Działa doskonale dla mnie na opencv 3.2 dla C/C++. Pamiętaj, że biblioteki opencv są instalowane w/usr/local/lib, jeśli postępujesz zgodnie z instrukcjami instalacji online. – Indeed

+0

@Indeed Twój komentarz powinien zostać poddany edycji w celu rozszerzenia rozwiązania dla użytkowników, którzy instalują za pośrednictwem innego pakietu python oprócz anacondy. – ScheissSchiesser

+1

Dziękuję za rozwiązanie; dla wszystkich tych, którzy próbują dostać to działa w określonym środowisku anaconda: twoje lib pliki mogą być w danym środowisku 'sudo execstack -c ~/anaconda3/envs/{ENVIRONMENT_NAME}/lib/libopencv_ *' – lwohlhart

3

Jest wiele rzeczy, które po prostu nie działają w tej chwili, ponieważ istnieją albo niezaimplementowane syscalls (WSL ma tylko częściowy zasięg, tylko około 70% syscalls są zaimplementowane, niektóre z nich tylko częściowo), albo brakuje tryby gniazd i opcje (WSL nie obsługuje jeszcze gniazd datagramów Uniksa, chociaż powinien być dostępny w następnym kompilacji).

Jeśli przejdziesz do github (BashOnWindows) i opublikujesz strace lub poszukaj swojego problemu i znajdziesz jego kopię, to jest najlepszy sposób, aby uzyskać odpowiedź. Zespół Microsoft pracujący nad tym projektem potrzebuje wielu opinii i usterek.

Dla jasności, mówię, że jesteś w 100% uruchomiony w coś, co nie zostało jeszcze zaimplementowane. Jednak może być pewien sposób, jeśli spojrzysz na kod źródłowy pliku .so, aby wyłączyć część kodu, który używa tej syscall (ponieważ Python jest crossplatform i nie wszystkie Linux syscalls są obsługiwane we wszystkich systemach operacyjnych * nix).

+0

Miałem dokładnie ten sam problem, czy publikujesz problem na BashOnWindows? – ramontiveros

+0

@ramontiveros Spróbuj wyszukać problem, ale tak, jeśli nie możesz znaleźć innej osoby, która to wypowiada, spróbuj opublikować na stronie github strace. –

1

miałem również ten sam problem, ale udało mi się go naprawić po prostu re-instalacji to

$ sudo apt-get install execstack

i komentarz wspomniano powyżej w systemie Windows 10 build 14393,479

0

Możesz użyć programu execstack do instalacji opencv, a nawet importowania biblioteki. Jednak do robienia wideo, jak w cv2.VideoCapture (0), bash dla Windows nie działa. Musisz mieć zainstalowaną pełną dystrybucję.