Python thực thi không tìm thấy thư viện chia sẻ libpython


143

Tôi đang cài đặt Python 2.7 trên CentOS 5. Tôi đã xây dựng và cài đặt Python như sau

./configure --enable-shared --prefix=/usr/local
make
make install

Khi tôi cố chạy / usr / local / bin / python, tôi nhận được thông báo lỗi này

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

Khi tôi chạy ldd trên / usr / local / bin / python, tôi nhận được

ldd /usr/local/bin/python
    libpython2.7.so.1.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e9a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e9200000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030fa200000)
    libm.so.6 => /lib64/libm.so.6 (0x00000030e9600000)
    libc.so.6 => /lib64/libc.so.6 (0x00000030e8e00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000030e8a00000)

Làm thế nào để tôi nói với Python nơi tìm libpython?

Câu trả lời:


203

Hãy thử như sau:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

Thay thế /usr/local/libbằng thư mục mà bạn đã cài đặt libpython2.7.so.1.0nếu không có /usr/local/lib.

Nếu điều này hoạt động và bạn muốn thực hiện các thay đổi vĩnh viễn, bạn có hai tùy chọn:

  1. Thêm export LD_LIBRARY_PATH=/usr/local/libvào bạn .profiletrong thư mục chính của bạn (chỉ làm việc nếu bạn đang sử dụng một lớp vỏ mà tải tập tin này khi một trường hợp vỏ mới được bắt đầu). Cài đặt này sẽ chỉ ảnh hưởng đến người dùng của bạn.

  2. Thêm /usr/local/libvào /etc/ld.so.confvà chạy ldconfig. Đây là một thiết lập toàn hệ thống tất nhiên.


Có cách nào để xuất nó để nó hoạt động với nhật thực không? Tôi đã thêm nó vào .profile của mình tuy nhiên sau đó Eclipse không thể khởi chạy gdb. (Lưu ý: Tuy nhiên, thêm nó vào ld.so.conf hoạt động)
Setheron

Vì vậy, tôi đã kiểm tra các biến môi trường nhật thực đang chạy và nó có LD_LIBRARY_PATH thích hợp. Tôi tin rằng khi nó khởi chạy GDB, nó không sử dụng bất kỳ shell nào và do đó không nhận được bất kỳ biến môi trường nào! Đặt libpython trong cấu hình gỡ lỗi cũng không giúp được gì vì đó chỉ là khi gdb thực sự tải (nhưng tôi cần lib cho chính gdb để tải)
Setheron

1
Bạn có thể gỡ lỗi ứng dụng thành công khi bạn chạy gdbtừ dòng lệnh và LD_LIBRARY_PATH được thiết lập đúng trong thiết bị đầu cuối không? Nếu không, có lẽ bạn sẽ phải thiết lập LD_LIBRARY_PATH trong .gdbinittệp của mình . Xem câu trả lời này để biết thêm thông tin: stackoverflow.com/a/7041845/156771
Tamás

Tôi cần LD_LIBRARY_PATH để khởi chạy gdb (lib python) không phải để gỡ lỗi thực tế cho ứng dụng của tôi. Cho đến nay tôi chỉ quản lý để sửa nó bằng cách đặt nó trong ldconfig. Tôi có thể gỡ lỗi ứng dụng qua CLI vì tuy nhiên, nó sẽ lấy LD_LIBRARY_PATH từ tệp ZSHRC của tôi.
Setheron

10
Chỉ là một lưu ý cho bất cứ ai đang thử điều này: Đó chỉ là "/ usr / local / lib", và không phải là "bao gồm" như bản gốc "bao gồm ld.so.conf.d / *. Conf".
timss

79

Đội chiếc mũ nghiêm trọng của tôi ...

Cách tốt nhất tôi tìm thấy để giải quyết vấn đề này là vào thời gian biên dịch. Vì dù sao bạn cũng là tiền tố cài đặt cũng có thể nói rõ cho người thực thi biết nơi tìm thư viện dùng chung. Không giống như OpenSSL và các gói phần mềm khác, Python không cung cấp cho bạn các chỉ thị cấu hình đẹp để xử lý các đường dẫn thư viện thay thế (không phải ai cũng là root mà bạn biết ...) Trong trường hợp đơn giản nhất, tất cả những gì bạn cần là:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-Wl,--rpath=/usr/local/lib"

Hoặc nếu bạn thích phiên bản không phải linux:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-R/usr/local/lib"

Các " rpath" cờ nói với python nó có thư viện runtime nó cần ở chỗ con đường đặc biệt. Bạn có thể đưa ý tưởng này đi xa hơn để xử lý các phụ thuộc được cài đặt ở một vị trí khác với các vị trí hệ thống tiêu chuẩn. Ví dụ: trên các hệ thống của tôi vì tôi không có quyền truy cập root và cần thực hiện các cài đặt Python gần như hoàn toàn khép kín, dòng cấu hình của tôi trông như thế này:

./configure --enable-shared \
            --with-system-ffi \
            --with-system-expat \
            --enable-unicode=ucs4 \
            --prefix=/apps/python-${PYTHON_VERSION} \
            LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \
            CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include"

Trong trường hợp này tôi đang biên soạn các thư viện mà sử dụng python (như ffi, readline, vv) vào một extlibthư mục trong cây thư mục python chính nó. Bằng cách này, tôi có thể tar thư mục python - $ {PYTHON_VERSION} và đặt nó ở bất cứ đâu và nó sẽ "hoạt động" (miễn là bạn không gặp phải libchoặc libmxung đột). Điều này cũng hữu ích khi cố gắng chạy nhiều phiên bản Python trên cùng một hộp, vì bạn không cần phải thay đổi LD_LIBRARY_PATHhoặc lo lắng về việc chọn phiên bản sai của thư viện Python.

Chỉnh sửa: Quên đề cập, trình biên dịch sẽ khiếu nại nếu bạn không đặt PYTHONPATHbiến môi trường thành tiền tố bạn sử dụng làm tiền tố và không biên dịch một số mô-đun, ví dụ: để mở rộng ví dụ trên, hãy đặt PYTHONPATHtiền tố được sử dụng ở trên ví dụ với export PYTHONPATH=/apps/python-${PYTHON_VERSION}...


//, Điều này trông giống như những gì tôi đang tìm kiếm. Tôi có thể tìm hiểu thêm về các cách để "tar thư mục phiên bản python và đặt nó ở bất cứ đâu và nó sẽ" hoạt động "(miễn là bạn không gặp phải xung đột libc hoặc libm)" ? Bạn có nghĩ rằng đáng để thực hiện một câu hỏi stackoverflow.com riêng biệt ra khỏi điều này?
Nathan Basan

// Ngoài ra, nên đặt $PYTHON_VERSIONnhư thế nào?
Nathan Basan

//, tôi đặt $PYTHON_VERSIONsau khi định cấu hình. Mặc dù vậy, ngay cả với $PYTHON_VERSIONbộ này, trình biên dịch vẫn phàn nàn vềPython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
Nathan Basan

//, Điều này có yêu cầu bất kỳ sửa đổi nào đối với makelệnh và các lệnh cài đặt khác không?
Nathan Basan

1
@NathanBasan trong trường hợp thiếu bz2, lời nguyền, gdbm, lzma, v.v., bạn sẽ cần phải biên dịch từng cái đầu tiên với tiền tố /apps/python-${PYTHON_VERSION}/extlibđể đảm bảo thư viện và tiêu đề của chúng nằm ở vị trí thích hợp cho quá trình tạo Python. Đối với các gói cấp hệ thống, có lẽ bạn sẽ bị mắc kẹt dựa vào người dùng root để cài đặt chúng cho bạn trước. Hoặc tìm một giải pháp thay thế có thể được biên soạn và hạ cánh trongextlib
Foosh

21

Tôi đã có cùng một vấn đề và tôi đã giải quyết nó theo cách này:

Nếu bạn biết libpython cư trú ở đâu, tôi cho rằng nó sẽ nằm /usr/local/lib/libpython2.7.so.1.0trong trường hợp của bạn, bạn chỉ cần tạo một liên kết tượng trưng cho nó:

sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0

Sau đó thử chạy lddlại và xem nếu nó hoạt động.


6

Tôi đã cài đặt Python 3.5 bởi Bộ sưu tập phần mềm trên CentOS 7 tối thiểu. Tất cả đều hoạt động tốt, nhưng tôi thấy lỗi thư viện dùng chung được đề cập trong câu hỏi này khi tôi thử chạy một tập lệnh CGI đơn giản:

tail /var/log/httpd/error_log
AH01215: /opt/rh/rh-python35/root/usr/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory

Tôi muốn một giải pháp vĩnh viễn trên toàn hệ thống, hoạt động cho tất cả người dùng, do đó loại trừ việc thêm các câu lệnh xuất vào các tệp .profile hoặc .bashrc. Có một giải pháp một dòng, dựa trên trang giải pháp Red Hat . Cảm ơn vì nhận xét đã chỉ ra:

echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh

Sau khi khởi động lại, tất cả đều tốt trên vỏ, nhưng đôi khi máy chủ web của tôi vẫn phàn nàn. Có một cách tiếp cận khác luôn hoạt động cho cả shell và máy chủ, và chung chung hơn. Tôi đã thấy giải pháp ở đây và sau đó nhận ra rằng nó thực sự được đề cập trong một trong những câu trả lời ở đây! Dù sao, trên CentOS 7, đây là các bước:

 vim /etc/ld.so.conf

Mà trên máy của tôi vừa có:

include ld.so.conf.d/*.conf

Vì vậy, tôi đã tạo một tệp mới:

vim /etc/ld.so.conf.d/rh-python35.conf

Và thêm:

/opt/rh/rh-python35/root/usr/lib64/

Và để tự xây dựng lại bộ đệm:

sudo ldconfig

Thế là xong, kịch bản hoạt động tốt!

Đây là một giải pháp tạm thời, không hoạt động trong các lần khởi động lại:

sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v

Tùy chọn -v (dài dòng) chỉ để xem những gì đang diễn ra. Tôi thấy rằng nó đã làm: libpython3.5m.so.rh-python35-1.0

Lỗi đặc biệt này đã biến mất. Ngẫu nhiên, tôi đã phải chownsử dụng apache để thoát khỏi lỗi cấp phép sau đó.

Lưu ý rằng tôi đã sử dụng find để định vị thư mục cho thư viện. Bạn cũng có thể làm:

sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0

Mà trên VM của tôi trả về:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0

Đó là con đường tôi cần đưa ra cho ldconfig, như hình trên.


1
Bạn có thể đã tự cứu mình một số rắc rối bằng cách truy cập /etc/profile.d và tạo một tệp có nội dung sau: #!/bin/bashsource scl_source enable rh-python35trong đó. access.redhat.com/solutions/527703
Doug

2

Trên Solaris 11

Sử dụng LD_LIBRARY_PATH_64để giải quyết symlink đến libs python.

Trong trường hợp của tôi, python3.6 LD_LIBRARY_PATHkhông hoạt động nhưng LD_LIBRARY_PATH_64đã làm.

Hi vọng điêu nay co ich.
Trân trọng


1

Điều này làm việc cho tôi ...

$ sudo apt-get install python2.7-dev

Xin chào, đây không phải là giải pháp chính xác, vì sau này, nhị phân python xây dựng tùy chỉnh của bạn đang sử dụng .so từ cái bạn đã cài đặt từ apt-get. Điều này có thể gây ra sự cố trong khi chúng có cùng phiên bản hoặc nếu bạn sửa đổi mã nguồn python, nó sẽ không mất công sức.
Azusa Nakano

0

Tôi đã cài đặt bằng lệnh:

./configure --prefix=/usr       \
            --enable-shared     \
            --with-system-expat \
            --with-system-ffi   \
            --enable-unicode=ucs4 &&

make

Bây giờ, là người dùng root:

make install &&
chmod -v 755 /usr/lib/libpython2.7.so.1.0

Sau đó, tôi đã cố gắng thực thi python và nhận được lỗi:

/ usr / local / bin / python: lỗi trong khi tải thư viện dùng chung: libpython2.7.so.1.0: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy

Sau đó, tôi đã đăng xuất khỏi người dùng root và một lần nữa cố gắng thực thi Python và nó đã hoạt động thành công.


0

Tất cả những gì nó cần là cài đặt libpython [3 hoặc 2] cài đặt tệp dev.


-1

chỉ cần cài đặt python-lib. (python27-lib). Nó sẽ cài đặt libpython2.7.so1.0. Chúng tôi không yêu cầu phải tự đặt bất cứ thứ gì.


4
//, Và nếu bạn đang bật, hãy nói, CEntOS 6.3? Điều này không hoạt động, ở đó và thường mọi người đang biên dịch Python để giải quyết trường hợp Python hệ thống là một phiên bản kỳ lạ, bị hỏng, không đáng tin cậy hoặc một số mong muốn khác không chạm vào toàn bộ hệ thống.
Nathan Basan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.