Giải pháp mạnh mẽ hơn
Đối với pip3, hãy sử dụng:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Đối với pip, chỉ cần loại bỏ 3 giây như sau:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
Sự lạ lùng của OSX
OSX, kể từ tháng 7 năm 2017, xuất xưởng một phiên bản sed rất cũ (một chục năm tuổi). Để có được các biểu thức chính quy mở rộng, sử dụng -E thay vì -r trong giải pháp trên.
Giải quyết các vấn đề với các giải pháp phổ biến
Giải pháp này được thiết kế và thử nghiệm tốt 1 , trong khi có những vấn đề với ngay cả những giải pháp phổ biến nhất.
- Các vấn đề về tính di động do thay đổi tính năng dòng lệnh pip
- Sự cố của xargs vì các lỗi quá trình con pip hoặc pip3 thông thường
- Đăng nhập đông đúc từ đầu ra xargs thô
- Dựa vào cầu nối Python-OS trong khi có khả năng nâng cấp nó 3
Lệnh trên sử dụng cú pháp pip đơn giản và di động nhất kết hợp với sed và sh để khắc phục hoàn toàn các vấn đề này. Chi tiết về hoạt động của sed có thể được xem xét kỹ lưỡng với phiên bản 2 đã nhận xét .
Chi tiết
[1] Đã thử nghiệm và sử dụng thường xuyên trong cụm Linux 4.8.16-200.fc24.x86_64 và thử nghiệm trên năm hương vị Linux / Unix khác. Nó cũng chạy trên Cygwin64 được cài đặt trên Windows 10. Cần thử nghiệm trên iOS.
[2] Để xem giải phẫu của lệnh rõ ràng hơn, đây là tương đương chính xác của lệnh pip3 ở trên với các nhận xét:
# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"
# separate the output of package upgrades with a blank line
sed="$sed/echo"
# indicate what package is being processed
sed="$sed; echo Processing \1 ..."
# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"
# output the commands
sed="$sed/p"
# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh
[3] Nâng cấp thành phần Python hoặc PIP cũng được sử dụng để nâng cấp thành phần Python hoặc PIP có thể là nguyên nhân tiềm ẩn của sự bế tắc hoặc hỏng cơ sở dữ liệu gói.
pip freeze
(nhưbundle install
hoặcnpm shrinkwrap
). Tốt nhất để lưu một bản sao đó trước khi mày mò.