pip cài đặt các gói thành công, nhưng không tìm thấy tệp thực thi từ dòng lệnh


108

Tôi đang làm việc trên mac OS X Yosemite, phiên bản 10.10.3.

Tôi đã cài đặt python2.7 và pip bằng macport như được thực hiện trong http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/

Tôi có thể cài đặt thành công các gói và nhập chúng vào bên trong môi trường python và tập lệnh python của mình. Tuy nhiên, không tìm thấy bất kỳ tệp thi hành nào được liên kết với một gói có thể được gọi từ dòng lệnh trong thiết bị đầu cuối.

Có ai biết những gì có thể là sai? (Thêm chi tiết bên dưới)

Ví dụ: trong khi cài đặt một gói có tên "rosdep" theo hướng dẫn trong http://wiki.ros.org/jade/Installation/Source

Tôi có thể chạy: sudo pip install -U rosdep cài đặt nào không có lỗi và các tệp tương ứng nằm trong/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

Tuy nhiên, nếu tôi cố gắng chạy:, sudo rosdep initnó sẽ báo lỗi:"sudo: rosdep: command not found"

Đây không phải là một lỗi cụ thể của gói. Tôi nhận được điều này cho bất kỳ gói nào được cài đặt bằng pip trên máy tính của tôi. Tôi thậm chí đã thử thêm

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

cho tôi $PATH. Nhưng các tệp thực thi không được tìm thấy trên dòng lệnh, mặc dù các gói hoạt động hoàn hảo từ bên trong python.


bất kỳ virtualenv tham gia?
JL Peyret

không, không có virtualenv nào tham gia.
Sanket_Diwale

khi bạn sudo, bạn chuyển sang $ PATH của người sử dụng gốc, chỉ cần đảm bảo PATH của mình được cập nhật, không PATH của bạn
Anthony Perot

Câu trả lời:


47

kiểm tra $ PATH của bạn

tox có chế độ dòng lệnh:

audrey:tests jluc$ pip list | grep tox
tox (2.3.1)

Nó đâu rồi?

(chỉnh sửa: 2.7mọi thứ không quan trọng nhiều ở đây, sub ở bất kỳ 3.xvà pip nào cũng hoạt động theo cùng một cách)

audrey:tests jluc$ which tox
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/tox

và có gì trong $ PATH của tôi?

audrey:tests jluc$ echo $PATH
/opt/chefdk/bin:/opt/chefdk/embedded/bin:/opt/local/bin:..../opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin...

Chú ý đến /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin ? Đó là những gì cho phép tìm kiếm nội dung được cài đặt bằng pip của tôi

Bây giờ, để xem mọi thứ ở đâu từ Python, hãy thử làm điều này (thay thế rosdepcho tox).

$python
>>> import tox
>>> tox.__file__

in ra:

'/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tox/__init__.pyc'

Bây giờ, cd vào thư mục ngay bên trên libtrong phần trên. Bạn có thấy thư mục bin không? Bạn có thấy rosdeptrong thùng đó không? Nếu vậy, hãy thử thêm binvào $ PATH của bạn.

audrey:2.7 jluc$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.7
audrey:2.7 jluc$ ls -1

đầu ra:

Headers
Python
Resources
bin
include
lib
man
share

Cảm ơn JL vì câu trả lời, nhưng đây chủ yếu là vấn đề của tôi. Đối với ứng dụng ví dụ của tôi là rosdep, khi tôi làm như bạn đã làm, đây là kết quả thu được: pip list | grep rosdep rosdep (0.11.4) mà rosdep (không có đầu ra), dòng lệnh không trả lại bất cứ điều gì
Sanket_Diwale

1
không trả lại rosdeplà phù hợp với vấn đề của bạn. ý của tôi là bạn cần tìm nơi rosdepcài đặt và $ PATH trông như thế nào.
JL Peyret

Cảm ơn, tôi đã cài đặt các tệp nhị phân của mình trong /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin. Đã thêm nó vào PATH và bây giờ nó đang hoạt động. Cảm ơn, tôi đã gặp sự cố khi định vị mã nhị phân vì nó không cung cấp bất kỳ đầu ra nào.
Sanket_Diwale

export PATH = / opt / local / Library / Frameworks / Python.framework / Versions / 2.7 / bin: $ PATH đã mất tích trên con đường của tôi và đã làm các trick cho tôi trên OSX
Caio Iglesias

1
Nếu bạn không thể tìm thấy chương trình bằng which(nếu nó chưa có trong đường dẫn của bạn), bạn cũng có thể thử tìm mã nhị phân bằng cách sử dụng mlocateLinux hoặc mdfindtrên macOS.
jackcogdill

53

Trên macOS có cài đặt python mặc định, bạn cần thêm /Users/<you>/Library/Python/2.7/bin/vào $ PATH của mình.

Thêm cái này vào .bash_profile của bạn:

export PATH="/Users/<you>/Library/Python/2.7/bin:$PATH"

Đó là nơi pip cài đặt các tệp thực thi.

Mẹo: Đối với phiên bản python không phải mặc định, which pythonhãy tìm vị trí cài đặt python của bạn và thay thế phần đó trong đường dẫn ở trên. (Cảm ơn vì gợi ý Sanket_Diwale)


8
Nơi cài đặt pip phụ thuộc vào cách bạn cài đặt python, MacOS có nhiều cách cài đặt python, như macports, homebrew và mặc định hệ thống. Tùy thuộc vào phiên bản python đang được sử dụng, bạn sẽ có các vị trí khác nhau cho pip. Một cách dễ dàng để tìm ra vị trí đặt pip và python là sử dụng "python nào" trong thiết bị đầu cuối và sau đó thêm vị trí thích hợp vào $ PATH.
Sanket_Diwale

Đối với macOS 10.14.3, cài đặt Python 3.6 từ python.org, which python3cuối cùng tôi đã dẫn tôi (thông qua một liên kết) đến /Library/Frameworks/Python.framework/Versions/3.6/bin/.
phoenix

42

Nếu bạn đang cài đặt bằng cách sử dụng --user(ví dụ pip3.6 install --user tmuxp), bạn có thể lấy thư mục cài đặt của người dùng dành riêng cho nền tảng từ chính Python bằng cách sử dụng sitemô-đun . Ví dụ: trên macOS:

$ python2.7 -m site --user-base
/Users/alexp/Library/Python/2.7

Bằng cách thêm /binvào điều này, bây giờ chúng ta có đường dẫn nơi các gói thực thi sẽ được cài đặt. Chúng tôi có thể tự động điền PATH trong tệp rc của shell của bạn dựa trên kết quả đầu ra; Tôi đang sử dụng bash, nhưng may mắn thay, điều này là di động:

# Add Python bin directories to path
python3.6 -m site &> /dev/null && PATH="$PATH:`python3.6 -m site --user-base`/bin"
python2.7 -m site &> /dev/null && PATH="$PATH:`python2.7 -m site --user-base`/bin"

Tôi sử dụng các phiên bản Python chính xác để giảm khả năng các tệp thực thi chỉ "biến mất" khi Python nâng cấp một phiên bản nhỏ, ví dụ: từ 3.5 lên 3.6. Chúng sẽ biến mất vì, như có thể thấy ở trên, đường dẫn cài đặt của người dùng có thể bao gồm phiên bản Python. Vì vậy, trong khi python3có thể trỏ đến 3,5 hoặc 3,6, python3.6sẽ luôn trỏ đến 3,6. Điều này cần được ghi nhớ khi cài đặt các gói tiếp theo, ví dụ như sử dụng pip3.6hết pip3.

Nếu bạn không bận tâm đến ý tưởng về các gói biến mất, bạn có thể sử dụng python2python3thay vào đó:

# Add Python bin directories to path
# Note: When Python is upgraded, packages may need to be re-installed
#       or Python versions managed.
python3 -m site &> /dev/null && PATH="$PATH:`python3 -m site --user-base`/bin"
python2 -m site &> /dev/null && PATH="$PATH:`python2 -m site --user-base`/bin"

21

Tôi biết câu hỏi hỏi về macOS, nhưng đây là một giải pháp cho những người dùng Linux đến đây thông qua Google.

Tôi đang gặp sự cố được mô tả trong câu hỏi này, đã cài đặt gói pdfx qua pip.

Tuy nhiên, khi tôi chạy nó, không có gì ...

pip list | grep pdfx
pdfx (1.3.0)

Chưa:

which pdfx
pdfx not found

Vấn đề trên Linux là pip install ...thả các tập lệnh vào ~/.local/binvà điều này không có trên Debian / Ubuntu mặc định $PATH.

Dưới đây là vấn đề GitHub sẽ được trình bày chi tiết hơn: https://github.com/pypa/pip/issues/3813

Để khắc phục, chỉ cần thêm ~/.local/binvào của bạn $PATH, ví dụ: bằng cách thêm dòng sau vào .bashrctệp của bạn :

export PATH="$HOME/.local/bin:$PATH"

Sau đó, khởi động lại trình bao của bạn và mọi thứ sẽ hoạt động như mong đợi.


2
Thay vì khởi động lại vỏ, bạn có thể source ~/.bashrctải lại .bashrccấu hình
Whiteclaws

1
Tuyệt quá. Tôi đã nhận được "lệnh độc tố không tìm thấy". Sau khi cập nhật PATH, nó hoạt động
GabrielBB

3

Trên Windows, bạn cần thêm đường dẫn %USERPROFILE%\AppData\Roaming\Python\Scriptsvào đường dẫn của mình.


3

Giải pháp

Dựa trên các câu trả lời khác, cho linuxmacbạn có thể chạy như sau:

echo "export PATH=\"`python3 -m site --user-base`/bin:$PATH\"" >> ~/.bashrc
source ~/.bashrc

thay vì python3bạn có thể sử dụng bất kỳ liên kết khác để phiên bản python: python, python2.7, python3.6, python3.9,, vv

Giải trình

Để biết nơi các gói người dùng được cài đặt trong hệ điều hành hiện tại (win, mac, linux), chúng tôi chạy:

python3 -m site --user-base

Chúng tôi biết rằng các tập lệnh đi đến bin/thư mục nơi các gói được cài đặt.

Vì vậy, chúng tôi nối các đường dẫn:

echo `python3 -m site --user-base`/bin

Sau đó, chúng tôi xuất nó sang một biến môi trường.

export PATH=\"`python3 -m site --user-base`/bin:$PATH\""

Cuối cùng, để tránh lặp lại lệnh xuất, chúng tôi thêm nó vào .bashrctệp của mình và chúng tôi chạy sourceđể chạy các thay đổi mới, cung cấp cho chúng tôi giải pháp được đề xuất đã đề cập ở phần đầu.


Điều này hiệu quả với tôi và tôi không biết tại sao
Benjamints

@Benjamints đã thêm một lời giải thích, hy vọng nó hữu ích, chúc bạn may mắn!
Willemoes

Cảm ơn rât nhiều! :)
Benjamints

2

Tôi đã vấp phải câu hỏi này vì tôi đã tạo, xây dựng và xuất bản thành công Gói PyPI nhưng không thể thực thi sau khi cài đặt. Các $PATHbiến được thiết lập một cách chính xác.

Trong trường hợp của tôi, vấn đề là tôi chưa đặt entry_pointtrong setup.pytệp:

entry_points = {'console_scripts':

['YOUR_CONSOLE_COMMAND=MODULE_NAME.FILE_NAME:FUNCTION_NAME'],},

2

Ngoài việc thêm binthư mục của python vào $PATHbiến, tôi cũng phải thay đổi chủ sở hữu của thư mục đó để làm cho nó hoạt động. Không hiểu tại sao tôi đã không phải là chủ sở hữu.

chown -R ~/Library/Python/

0

Khi bạn cài đặt Python hoặc Python3 bằng trình cài đặt MacOS (tải xuống từ trang web Python) - nó sẽ thêm lỗi exportvào ~/.profiletập lệnh của bạn . Tất cả những gì bạn cần làm chỉ là sourcenó. Khởi động lại tất cả các thiết bị đầu cuối cũng nên thực hiện thủ thuật.

CẢNH BÁO - Tôi tin rằng tốt hơn là chỉ sử dụng pip3 với Python3 - vì những lợi ích trong tương lai.

Nếu bạn đã cài đặt Python3, các bước sau phù hợp với tôi trên macOS Mojave:

  1. Cài đặt ansible trước bằng cách sử dụng sudo-sudo -H pip3 install ansible

  2. bạn tạo một liên kết tượng trưng đến binđường dẫn của Python

sudo ln -s /Library/Frameworks/Python.framework/Versions/Current/bin /Library/Frameworks/Python.framework/current_python_bin

và ghim nó vào .profile

export PATH=$PATH:/Library/Frameworks/Python.framework/current_python_bin

  1. chạy source ~/.profilevà khởi động lại tất cả các shell đầu cuối.

  2. Kiểu ansible --version

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.