IT Share you

터미널 프롬프트없이 IPython 세션에서 복사하는 방법

shareyou 2020. 12. 4. 21:26
반응형

터미널 프롬프트없이 IPython 세션에서 복사하는 방법


종종 내 워크 플로는 IPython 셸에서 데이터 정리 / 통합을 포함합니다. 이것은 터미널 인터페이스에 대한 모든 훌륭한 업그레이드 와 함께 IPython 버전 5.0 이후로 특히 훌륭해 졌습니다 . 그래서, 제가 구조화되지 않은 데이터의 일부를 정리하려고 시도한다고 가정 해 봅시다.

In [11]: for i, (num, header, txt) in enumerate(data):
    ...:     header = [e.strip() for e in header.strip().split('\n')]
    ...:     header[4] = header[4].strip(',').split(',')
    ...:     data[i] = (num, header, txt)
    ...:

환상적입니다! 하지만 이제는 에디터의 스크립트에 이것을 추가하고 싶습니다. 터미널에서 복사하여 붙여 넣으면 왼쪽에있는 모든 정크를 캡처합니다. 에디터에서 좀 더 쉽게 정리할 수 있지만, 마우스를 건드리지 않고 추가 항목도 잡지 않고 터미널에서 클립 보드로 직접 코드를 복사 할 수 있다면 좋을 것입니다. IPython에 그러한 기능이 있습니까?


%history마법을 사용 하여 세션에서 흥미로운 부분을 추출 할 수 있습니다 . 그들은 쓰레기없이 터미널에 표시됩니다.

In [1]: import numpy as np    
In [2]: a = np.random(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-83ce219ad17b> in <module>()
----> 1 a = np.random(10)

TypeError: 'module' object is not callable

In [3]: a = np.random.random(10)
In [4]: for i in a:
   ...:     print(i)
   ...:     
0.688626523886
[...]
0.341394850998

위 세션의 일부를 저장하려면 다음을 사용할 수 있습니다.

In [5]: %history 1 3-4

import numpy as np
a = np.random.random(10)
for i in a:
    print(i)

위의 예 %history 1 3-4에서 유지하려는 모든 명령을 조합하고 필요하지 않은 명령은 생략했습니다 (2 행, 오류가있는 명령). 이제 멋지게 복사 할 수있는 세션 버전이 있습니다.

파일 작성

-f FILENAMEas 매개 변수를 사용하여 파일에 직접 쓸 수도 있습니다 .

In [8]: %history 1 3-4 -f /tmp/foo.py

그러나 이것은 기존 파일덮어 씁니다 . 자세한 내용은 마법문서%history 에서 찾을 수 있습니다 .


그래서 마침내 내가 원했던 것과 정확히 일치하는 훌륭한 솔루션을 찾았습니다. IPython에서 Vi 모드 사용. 버전 5에서는 다음이 필요합니다.

$ ipython --TerminalInteractiveShell.editing_mode=vi

이제 편리한 vi와 같은 시각 모드를 사용하고 필요한 모든 것을 잡아 당길 수 있습니다!

내 .bash_profile / .bash_rc에 다음과 같은 새 별칭이 생성됩니다.

alias vpython='ipython --TerminalInteractiveShell.editing_mode=vi'

save마법 명령 [ 문서 ] 파일로 원하는 입력 라인을 저장; -a옵션은 "추가"모드 용이므로 파일을 덮어 쓰는 대신 파일 끝에 줄이 추가됩니다. 나는 항상 그것을 사용합니다.

귀하의 예 :

%save -a myfile.py 11
# the '%' is not necessary
save -a myfile.py 11

그런 다음 IPython으로 계속 코딩 할 수 있습니다.

같은 파일에 쓰려는 다른 명령이있는 경우 입력 save한 다음 위쪽 화살표를 사용하여 "저장"의 마지막 사용 ( -a옵션과 파일 이름이 이미 있음)으로 돌아가서 행을 편집 할 수 있습니다. 번호.

저장할 여러 줄과 줄 범위를 지정할 수 있습니다.

save -a myfile.py 15 18 19-25

In the shell you can first convert the IPython file to a regular Python file (.py) and then do the clean up:

http://ipython.org/ipython-doc/3/notebook/nbconvert.html (see --to script format)

You can also download the file in the notebook editor as Python file and perform the cleanup after this step.


I don't think terminal applications really get access to the copy/paste buffer. You're going to have to use the mouse. How do do it depends on what terminal you're using. Most modern terminals have some sort of "rectangular select" or "block select" mode.

With Windows, rectangular select is the default for cmd.exe and Powershell. If you're using Cygwin's mintty, hold Alt and then select the region with the mouse. The same goes for PuTTY.

On Linux (which I don't have in front of me - take these with a grain of salt), xterm doesn't support it, Gnome Terminal uses Ctrl as the modifier, and KDE's Konsole uses Ctrl+Alt.

For OS X Terminal, the Internet tells me that you use while clicking.

Other terminals (and GNU Screen) likely have the feature, it's just a matter of figuring out how to activate it.

참고URL : https://stackoverflow.com/questions/41070403/how-to-copy-from-ipython-session-without-terminal-prompts

반응형