2011-12-05 20 views
48

Tôi muốn có được tự động hoàn thành trên các kịch bản python của tôi cũng trong các đối số.Python argparse và bash hoàn thành

tôi chưa bao giờ thực sự hiểu thế nào bash_completion làm việc (đối với đối số), nhưng sau khi tôi đào trong tôi hiểu rằng:

  1. nó sử dụng "hoàn thành" để ràng buộc một chức năng hoàn thành một lệnh
  2. mỗi chức năng hoàn thành về cơ bản là bản sao của trình phân tích cú pháp đối số

Điểm thứ hai nói riêng là không lớn, bởi vì tôi muốn nó được tạo tự động.

Điều tốt nhất là trình vỏ sẽ hỏi chương trình của tôi ở mọi TAB về những gì cần hoàn thành, nhưng tôi có ấn tượng rằng điều này không thể thực sự hiệu quả, đúng không?

Tùy chọn thứ hai có lẽ chỉ là viết trình chuyển đổi từ trình phân tích cú pháp argparse thành hàm vỏ hoàn thành chính xác.

+5

Bạn đã xem chủ đề này http://bugs.python.org/issue4256 chưa? Nó cũng có vẻ như 'optparse' có hỗ trợ hoàn thành shell tự động: http: //pypi.python.org/pypi/optcomplete – Chris

Trả lời

13

Bash "completion" thực sự tuyệt vời. Và dễ dàng cho các chương trình được viết bằng Python ....

Tôi nghĩ đây chỉ là những gì bạn muốn: optcomplete: Shell Completion Self-Generator for Python. Nó có sẵn, ví dụ như gói "python-optcomplete" trong Ubuntu.

Bạn chèn một vài dòng trong chương trình python của bạn, và người sử dụng (một lần) chạy bash chương trình "hoàn thành" nói bash như thế nào để hoàn thành luận:

complete -F _optcomplete <program> 

và bây giờ người dùng có hoàn ! Theo mặc định, nó cho phép hoàn thành đơn giản trên các tùy chọn chương trình. Xem ví dụ về cách tùy chỉnh cách hoàn thành hoạt động cho một tùy chọn cụ thể. Nó được viết đẹp mắt và dễ mở rộng để xử lý các lệnh phụ, các tùy chọn hoàn thành thay thế, v.v.

Cập nhật:

Đối với hoàn trong zsh (cho cả optparse và argparse) thấy genzshcomp 0.3.1 : Python Package Index

Theo ghi nhận của @englebip, chúng tôi vẫn cần một cái gì đó tương tự cho argparse mô-đun mới, được giới thiệu trong Python 2.7 và 3.2, kể từ optparse hiện không được chấp nhận.

Dưới đây là các cuộc thảo luận về di chuyển theo hướng đó:

Xem thêm nền này về cách nó được thực hiện: How does argparse (and the deprecated optparse) respond to 'tab' keypress after python program name, in bash? - Stack Overflow

+2

Điều này thực sự rất tuyệt, nhưng nó hoạt động cho mô-đun 'optparse' đã lỗi thời và không cho' argparse' hiện tại. Bất kỳ ý tưởng của một tái thực hiện với 'argparse'? – englebip

+0

@englebip Thật khó để mô tả 'optparse' là lỗi thời kể từ khi thay thế, argparse, lần đầu tiên được giới thiệu trong Python 2.7 và Python 3.2. Thuật ngữ chính thức là "Không được chấp nhận", có thể kéo dài trong một thời gian dài. Nhưng tôi thực sự muốn thấy một cái gì đó như không hoàn thành cho argparse, và có những nỗ lực để làm cho điều đó xảy ra. – nealmcb

58

Shameless tự quảng bá : https://github.com/kislyuk/argcomplete

argcomplete cung cấp hoàn thành bash cho argparse.

+2

Tôi cũng khuyên bạn nên sử dụng nó. –

+0

Ngoài ra _exactly_ những gì @ andrea-crotti đang tìm kiếm – Thomas

+0

@weaver Từ tài liệu, có vẻ như hoàn thành toàn cầu phải được bật hoặc một câu lệnh eval cụ thể cần được thêm vào bashrc. Có cách nào để tạo kịch bản hoàn thành và để bash biết vị trí của tập lệnh không? – balki