Hướng dẫn ipython embed - ipython nhúng

Tôi chỉ sử dụng cái này:

from IPython import embed; embed()

hoạt động tốt hơn bất cứ thứ gì khác đối với tôi :)


Update:

Trong lễ kỷ niệm câu trả lời này nhận được 50 upvote, đây là những bản cập nhật tôi đã thực hiện đoạn trích này trong sáu năm can thiệp kể từ khi nó được đăng.

Đầu tiên, bây giờ tôi muốn nhập và thực hiện trong một tuyên bố, vì tôi sử dụng màu đen cho tất cả mã python của mình ngày nay và nó định dạng lại đoạn trích ban đầu theo cách không có ý nghĩa trong bối cảnh cụ thể và bất thường này. Vì thế:

 __import__("IPython").embed()

Cho hơn tôi thường sử dụng điều này bên trong một vòng lặp hoặc một luồng, có thể hữu ích khi bao gồm một đoạn trích cho phép chấm dứt quy trình cha mẹ (một phần để thuận tiện và một phần để nhắc nhở bản thân về cách tốt nhất để làm điều đó). os._exit là lựa chọn tốt nhất ở đây, vì vậy đoạn trích của tôi bao gồm điều này (cùng logic w/r/t bằng cách sử dụng một câu lệnh):

q = __import__("functools").partial(__import__("os")._exit, 0)

Sau đó, tôi chỉ có thể sử dụng q() nếu/khi tôi muốn thoát khỏi quy trình chính.

Đoạn trích đầy đủ của tôi (với

 __import__("IPython").embed()
0 trong trường hợp tôi có thể quên loại bỏ nó!) Trông như thế này:

q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  

Bạn không cần phải biết bất cứ điều gì ngoài Python để bắt đầu sử dụng ipython - chỉ cần gõ các lệnh như bạn làm tại dấu nhắc Python tiêu chuẩn. Nhưng Ipython có thể làm nhiều hơn lời nhắc tiêu chuẩn. Một số tính năng chính được mô tả ở đây. Để biết thêm thông tin, hãy kiểm tra trang Mẹo hoặc xem các ví dụ trong Sách nấu ăn Ipython.tips page, or look at examples in the IPython cookbook.

Nếu bạn đã thực hiện điều đó nhưng hãy xem cách cài đặt Ipython.how to install ipython.

Nếu bạn không bao giờ sử dụng Python trước đây, bạn có thể muốn xem hướng dẫn chính thức hoặc một giải pháp thay thế, đi sâu vào Python.

Bắt đầu ipython bằng cách phát hành lệnh

 __import__("IPython").embed()
1 từ vỏ của bạn, bạn nên được chào đón bằng cách sau:

Python 3.6.0
Type 'copyright', 'credits' or 'license' for more information
IPython 6.0.0.dev -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Không giống như Python REP, bạn sẽ thấy rằng dấu nhắc đầu vào là

 __import__("IPython").embed()
2 thay vì
 __import__("IPython").embed()
3. Số
 __import__("IPython").embed()
4 trong lời nhắc sẽ được sử dụng sau này trong hướng dẫn này nhưng thường không ảnh hưởng đến tính toán.

Bạn sẽ có thể nhập các biểu thức dòng đơn và nhấn Enter để đánh giá chúng. Nếu một biểu thức không đầy đủ, ipython sẽ tự động phát hiện điều này và thêm một dòng mới khi bạn nhấn enter thay vì thực thi ngay lập tức.

Hãy thoải mái khám phá đầu vào văn bản nhiều dòng. Không giống như nhiều bản sao khác, với ipython, bạn có thể sử dụng các khóa mũi tên lên và xuống khi chỉnh sửa các khối mã đa dòng.

Dưới đây là một ví dụ về sự tương tác dài hơn với ipython replin, mà chúng ta thường gọi là phiên ipython

In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:

Chúng tôi đã giành được chi tiết ngay bây giờ, nhưng bạn có thể nhận thấy một vài sự khác biệt đối với Python Repress tiêu chuẩn. Đầu tiên, mã của bạn phải được đánh sáng bằng cú pháp khi bạn gõ. Thứ hai, bạn sẽ thấy rằng một số kết quả sẽ có dấu nhắc

 __import__("IPython").embed()
5, trong khi một số khác thì không. Chúng tôi sẽ đến với điều này sau.

Tùy thuộc vào lệnh chính xác mà bạn đang nhập, bạn có thể nhận ra rằng đôi khi Enter sẽ thêm một dòng mới và đôi khi nó sẽ thực thi câu lệnh hiện tại. Ipython cố gắng đoán xem bạn đang làm gì, vì vậy hầu hết thời gian bạn không nên quan tâm. Mặc dù nếu có bất kỳ cơ hội nào Ipython không làm đúng, bạn có thể buộc thực thi khối mã hiện tại bằng cách nhấn theo trình tự ESC và ENTER. Bạn cũng có thể buộc chèn một dòng mới ở vị trí của con trỏ bằng cách sử dụng Ctrl-O.

Bốn lệnh hữu ích nhất

Bốn lệnh hữu ích nhất, cũng như mô tả ngắn gọn của chúng, được hiển thị cho bạn trong một biểu ngữ, mỗi khi bạn bắt đầu ipython:

yêu cầu

sự mô tả

?

Giới thiệu và tổng quan về các tính năng của Ipython.

%quickref

Tham khảo nhanh.

Cứu giúp

Hệ thống trợ giúp riêng của Python.

object?

Chi tiết về ‘đối tượng, sử dụng‘ đối tượng ?? để biết thêm chi tiết.

Hoàn thành tab

Hoàn thành tab, đặc biệt là đối với các thuộc tính, là một cách thuận tiện để khám phá cấu trúc của bất kỳ đối tượng nào mà bạn đang xử lý. Chỉ cần nhập

 __import__("IPython").embed()
6 để xem các thuộc tính của đối tượng. Bên cạnh các đối tượng Python và từ khóa, Tab hoàn thành cũng hoạt động trên tên tệp và thư mục.

Bắt đầu với Ipython 6.0, nếu

 __import__("IPython").embed()
7 được cài đặt, Ipython cũng sẽ cố gắng hoàn thành từ Jedi. Điều này cho phép không chỉ kiểm tra các đối tượng hiện có, mà còn suy ra hoàn thành tĩnh mà không cần thực thi mã. Không có gì cần thiết để làm cho nó hoạt động, chỉ cần sử dụng hoàn thành tab trên các biểu thức phức tạp hơn như sau:

>>> data = ['Number of users', 123456]
... data[0].<tab>

Ipython và Jedi sẽ có thể suy luận rằng

 __import__("IPython").embed()
8 thực sự là một chuỗi và sẽ hiển thị các kết thúc có liên quan như
 __import__("IPython").embed()
9,
q = __import__("functools").partial(__import__("os")._exit, 0)
0 và các phương thức chuỗi khác. Bạn có thể sử dụng phím tab để chu kỳ thông qua các lần hoàn thành và trong khi hoàn thành được tô sáng, loại của nó cũng sẽ được hiển thị. Khi loại hoàn thành là một hàm, trình tuân thủ cũng sẽ hiển thị chữ ký của hàm khi được tô sáng.

Khám phá các đối tượng của bạn

q = __import__("functools").partial(__import__("os")._exit, 0)
1 sẽ in tất cả các loại chi tiết về bất kỳ đối tượng nào, bao gồm DocStrings, các dòng định nghĩa chức năng (cho các đối số cuộc gọi) và chi tiết hàm tạo cho các lớp. Để có được thông tin cụ thể về một đối tượng, bạn có thể sử dụng các lệnh ma thuật
q = __import__("functools").partial(__import__("os")._exit, 0)
2,
q = __import__("functools").partial(__import__("os")._exit, 0)
3,
q = __import__("functools").partial(__import__("os")._exit, 0)
4 và
q = __import__("functools").partial(__import__("os")._exit, 0)
5

Chức năng ma thuật

Ipython có một tập hợp các chức năng ma thuật được xác định trước mà bạn có thể gọi với cú pháp kiểu dòng lệnh. Có hai loại phép thuật, định hướng dòng và định hướng tế bào. Các phép thuật dòng được đặt trước với ký tự

q = __import__("functools").partial(__import__("os")._exit, 0)
6 và hoạt động giống như các cuộc gọi dòng lệnh hệ điều hành: chúng nhận được một đối số phần còn lại của dòng, trong đó các đối số được truyền mà không có dấu ngoặc đơn hoặc trích dẫn. MAGICS có thể trả về kết quả và có thể được sử dụng ở phía bên phải của một nhiệm vụ. Các phép thuật của tế bào được có tiền tố với một kép
q = __import__("functools").partial(__import__("os")._exit, 0)
7 và chúng là các chức năng nhận được như một đối số không chỉ phần còn lại của dòng, mà cả các dòng bên dưới nó trong một đối số riêng biệt.Line magics are prefixed with the
q = __import__("functools").partial(__import__("os")._exit, 0)
6 character and work much like OS command-line calls: they get as an argument the rest of the line, where arguments are passed without parentheses or quotes. Lines magics can return results and can be used in the right hand side of an assignment. Cell magics are prefixed with a double
q = __import__("functools").partial(__import__("os")._exit, 0)
7, and they are functions that get as an argument not only the rest of the line, but also the lines below it in a separate argument.

Pháp thuật rất hữu ích vì các chức năng thuận tiện trong đó cú pháp Python không phải là tự nhiên nhất, hoặc khi một người muốn nhúng cú pháp Python không hợp lệ trong dòng công việc của chúng.

Các ví dụ sau đây cho thấy cách gọi ma thuật

q = __import__("functools").partial(__import__("os")._exit, 0)
8 tích hợp, cả trong chế độ dòng và ô:

In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop

Các phép thuật tích hợp bao gồm:

  • Các chức năng hoạt động với mã:

    q = __import__("functools").partial(__import__("os")._exit, 0)
    
    9,
    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    0,
    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    1,
    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    2,
    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    3, v.v.

  • Các chức năng ảnh hưởng đến vỏ:

    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    4,
    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    5,
    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    6, v.v.

  • Các chức năng khác như

    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    7,
    q = __import__("functools").partial(__import__("os")._exit, 0)
    
    8,
    q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
    __import__("IPython").embed()  # FIXME  
    
    9,
    Python 3.6.0
    Type 'copyright', 'credits' or 'license' for more information
    IPython 6.0.0.dev -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]:
    
    0 hoặc
    Python 3.6.0
    Type 'copyright', 'credits' or 'license' for more information
    IPython 6.0.0.dev -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]:
    
    1.

Bạn luôn có thể gọi ma thuật bằng tiền tố

q = __import__("functools").partial(__import__("os")._exit, 0)
6 và nếu bạn tự gọi một phép thuật trên một dòng, miễn là định danh không được xác định trong không gian tên của bạn, bạn có thể bỏ qua điều đó thậm chí:

Bạn có thể chuyển đổi hành vi này bằng cách chạy ma thuật

q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
6. Magics di động phải luôn có tiền tố
q = __import__("functools").partial(__import__("os")._exit, 0)
7.

Một lời giải thích chi tiết hơn về hệ thống ma thuật có thể được lấy bằng cách gọi

Python 3.6.0
Type 'copyright', 'credits' or 'license' for more information
IPython 6.0.0.dev -- An enhanced Interactive Python. Type '?' for help.

In [1]:
5 và để biết thêm chi tiết về bất kỳ chức năng ma thuật nào, hãy gọi
Python 3.6.0
Type 'copyright', 'credits' or 'license' for more information
IPython 6.0.0.dev -- An enhanced Interactive Python. Type '?' for help.

In [1]:
6 để đọc tài liệu của nó. Để xem tất cả các chức năng ma thuật có sẵn, hãy gọi
Python 3.6.0
Type 'copyright', 'credits' or 'license' for more information
IPython 6.0.0.dev -- An enhanced Interactive Python. Type '?' for help.

In [1]:
7.

Chạy và chỉnh sửa Or

Lệnh ma thuật

q = __import__("functools").partial(__import__("os")._exit, 0)
9 cho phép bạn chạy bất kỳ tập lệnh Python nào và tải tất cả dữ liệu của nó trực tiếp vào không gian tên tương tác. Vì tệp được đọc lại từ đĩa mỗi lần, các thay đổi bạn thực hiện với nó được phản ánh ngay lập tức (không giống như các mô-đun được nhập, phải được tải lại cụ thể). Ipython cũng bao gồm dreload, chức năng tải lại đệ quy.dreload, a recursive reload function.

q = __import__("functools").partial(__import__("os")._exit, 0)
9 có các cờ đặc biệt để định thời gian thực hiện các tập lệnh của bạn (-T) hoặc để chạy chúng dưới sự kiểm soát của trình gỡ lỗi Python tựa PDB (-D) hoặc Profiler (-p).

Lệnh

q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
0 cung cấp một xấp xỉ hợp lý của chỉnh sửa nhiều dòng, bằng cách gọi trình chỉnh sửa yêu thích của bạn tại chỗ. Ipython sẽ thực thi mã bạn nhập vào đó như thể nó được gõ một cách tương tác. Lưu ý rằng để
q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
0 hoạt động, cuộc gọi khởi động biên tập viên của bạn phải là một cuộc gọi chặn. Trong môi trường GUI, biên tập viên của bạn có thể sẽ có một tùy chọn như vậy.

Gỡ lỗi

Sau khi xảy ra ngoại lệ, bạn có thể gọi

In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
2 để nhảy vào trình gỡ lỗi Python (PDB) và kiểm tra vấn đề. Ngoài ra, nếu bạn gọi
In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
3, ipython sẽ tự động khởi động trình gỡ lỗi trên bất kỳ ngoại lệ chưa được thực hiện nào. Bạn có thể in các biến, xem mã, thực thi các câu lệnh và thậm chí đi lên và xuống ngăn xếp cuộc gọi để theo dõi nguồn thực sự của vấn đề. Đây có thể là một cách hiệu quả để phát triển và gỡ lỗi mã, trong nhiều trường hợp loại bỏ sự cần thiết của các câu lệnh in hoặc các công cụ gỡ lỗi bên ngoài.

Bạn cũng có thể bước qua một chương trình ngay từ đầu bằng cách gọi

In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
4.

Lịch sử¶

Ipython lưu trữ cả hai lệnh bạn nhập và kết quả mà nó tạo ra. Bạn có thể dễ dàng vượt qua các lệnh trước đó với các phím tăng và xuống hoặc truy cập vào lịch sử của bạn theo những cách tinh vi hơn.

Lịch sử đầu vào và đầu ra được giữ trong các biến được gọi là

In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
5 và
In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
6, được khóa bởi các số nhắc nhở, ví dụ:
In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
7. Ba đối tượng cuối cùng trong lịch sử đầu ra cũng được giữ trong các biến có tên
In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
8,
In [1]: print('Hello IPython')
Hello IPython

In [2]: 21 * 2
Out[2]: 42

In [3]: def say_hello(name):
   ...:     print('Hello {name}'.format(name=name))
   ...:
9 và
>>> data = ['Number of users', 123456]
... data[0].<tab>
0.

Bạn có thể sử dụng chức năng ma thuật

>>> data = ['Number of users', 123456]
... data[0].<tab>
1 để kiểm tra đầu vào và đầu ra trong quá khứ. Lịch sử đầu vào từ các phiên trước được lưu trong cơ sở dữ liệu và Ipython có thể được cấu hình để lưu lịch sử đầu ra.

Một số hàm ma thuật khác có thể sử dụng lịch sử đầu vào của bạn, bao gồm

q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
0,
>>> data = ['Number of users', 123456]
... data[0].<tab>
3,
q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
3,
q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
2,
q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
1 và
>>> data = ['Number of users', 123456]
... data[0].<tab>
7. Bạn có thể sử dụng một định dạng tiêu chuẩn để tham khảo các dòng:

Điều này sẽ lấy dòng 3 và dòng 18 đến 20 từ phiên hiện tại và các dòng 1-5 từ phiên trước.

Các lệnh shell hệ thống

Để chạy bất kỳ lệnh nào tại shell hệ thống, chỉ cần tiền tố nó với

>>> data = ['Number of users', 123456]
... data[0].<tab>
8, ví dụ:

Bạn có thể thu được đầu ra vào danh sách Python, ví dụ:

>>> data = ['Number of users', 123456]
... data[0].<tab>
9. Để truyền các giá trị của các biến hoặc biểu thức Python cho các lệnh hệ thống, hãy đặt tiền tố chúng với $:
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
0 hoặc bọc trong
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
1. Xem phần vỏ của chúng tôi để biết thêm chi tiết.our shell section for more details.

Xác định bí danh hệ thống của riêng bạn

Nó thuận tiện để có bí danh cho các lệnh hệ thống bạn sử dụng thường xuyên nhất. Điều này cho phép bạn làm việc liền mạch từ bên trong ipython với các lệnh tương tự bạn đã quen với vỏ hệ thống của mình. Ipython đi kèm với một số bí danh được xác định trước và một hệ thống hoàn chỉnh để thay đổi các thư mục, cả thông qua một ngăn xếp (xem

In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
2,
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
3 và
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
4) và thông qua trực tiếp
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
5. Sau này giữ một lịch sử của các thư mục đã truy cập và cho phép bạn đi đến bất kỳ ai đã ghé thăm trước đó.

Cấu hình¶

Phần lớn Ipython có thể được điều chỉnh thông qua cấu hình. Để bắt đầu, hãy sử dụng lệnh

In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
6 để tạo các tệp cấu hình mặc định. Chúng sẽ được đặt trong
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
7 và chứa các bình luận giải thích những tùy chọn khác nhau làm gì.configuration. To get started, use the command
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
6 to produce the default config files. These will be placed in
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
7, and contain comments explaining what the various options do.

Hồ sơ cho phép bạn sử dụng ipython cho các tác vụ khác nhau, giữ các tệp cấu hình và lịch sử riêng biệt cho từng tác phẩm. Thêm chi tiết trong phần Hồ sơ.the profiles section.

Các tập tin khởi động

Nếu bạn muốn một số mã được chạy vào đầu mỗi phiên ipython, cách dễ nhất là thêm các tập lệnh python (.py) hoặc ipython (.ipy) vào thư mục

In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
8 của bạn. Các tệp ở đây sẽ được thực thi ngay khi shell ipython được xây dựng, trước bất kỳ mã hoặc tập lệnh nào khác mà bạn đã chỉ định. Các tệp sẽ được chạy theo thứ tự tên của chúng, vì vậy bạn có thể kiểm soát thứ tự với các tiền tố, như
In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...: max(x)
...:
1000 loops, best of 3: 223 us per loop
9.