문제

중복 기능이있는 몇 가지 ipython 스크립트가 있습니다. 공통 기능을 하나의 모듈로 리팩터링하고 기존 스크립트에 해당 모듈을 포함 시키려고합니다. 문제는 코드가 ipython의 언어 확장 (!, $ 등)을 사용하므로 파이썬 모듈을 만들 수 없다는 것입니다. ipython 코드가있는 모듈을 만들고 다른 ipython 스크립트에 포함시킬 수 있습니까?

도움이 되었습니까?

해결책

ipython 확장 물건을 저장해서는 안됩니다 (?, !, %run) 파일에서. 항상. 그것들은 대화식 도구이며 손으로 입력하는 것이지만 파일에 절대 저장하지 않습니다.

  1. 파일들 사이에서 공통 기능을 찾으십시오. 당신은 이것의 후보자 인 정확히 네 종류의 것들이 있습니다.

    • 수입 (import)

    • 함수 정의 (def)

    • 클래스 정의 (class)

    • 글로벌 변수 할당

    이 코드에서 모든 ipython 대화식 기능을 제거해야합니다. 그것의 모든.

  2. 스크립트를 다시 작성하여 (1) 일반적인 물건을 가져 오십시오. (2)해야 할 유용한 작업을 수행하십시오.

    이 코드에서 모든 ipython 대화식 기능을 제거해야합니다. 그것의 모든.

    이제 스크립트를 실행할 수 있으며 적절한 파이썬 스크립트가 가정하는 것처럼 작업을 수행합니다.

여전히 ipython 확장 기능과 같은 기능을 사용할 수 있습니다 !, ? 그리고 %run 입력 할 때는 파일에 저장해서는 안됩니다.

다른 팁

기술적으로 스크립트를 저장하면 .ipy 확장, Ipython은 그것을보고 Python 통역사에게 직접 전달하기보다는 멋진 것들을 모두 사용합니다. 그러나 나는 일반적으로 이것에 대해 추천하고 위의 S.Lott의 경로로 이동합니다.

많은 사람들이 당신이 Ipython 구문이있는 스크립트를 가지고 있지 않아야한다고 믿지만, 당신이 충분히 궁금하다면 (내가 그대로) Python과 Shell Scripts를 혼합하는 재미있는 방법을 찾고 있다면 내 확인을 확인해야합니다. Github의 래퍼 프로그램

예제 사용 사례 :

$ cat > example.ipy

rehashx

a = !ls -l | tail -n 3
print a.fields(0)

b = 'foo'
echo bar ${b}

$ ipyscript.py example.ipy

['-rw-r--r--', 'drwxr-xr-x', 'drwxrwxr-x']
bar foo

결과적으로 IPYTHON CORE는 위의 스크립트의 (거의 기능적) 버전을 지원합니다.

In [2]: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy?
Type:       instancemethod
Base Class: <type 'instancemethod'>
String Form:<unbound method InteractiveShell.safe_execfile_ipy>
Namespace:  Interactive
File:       /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py
Definition: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy(self, fname)
Docstring:
Like safe_execfile, but for .ipy files with IPython syntax.

Parameters
----------
fname : str
    The name of the file to execute.  The filename must have a
    .ipy extension.

대화식 버전의 ipython에 명령을 입력 한 다음 HIST 명령 (-N과 함께 라인 번호를 제거)을 사용하는 경우, IPython은 실제 Python 코드를 사용하여! CD! LS 등. 예는 다음과 같습니다.

_ip.system("ls")
_ip.system("ls -F ")
_ip.magic("cd ")

http://ipython.scipy.org/moin/ipythonextensionapi 이 개체를 설명합니다. 이것은 기본적으로해야 할 일입니다 (링크에서 조정) :

import IPython.ipapi
_ip = IPython.ipapi.get()

이제 iPython Shell의 HIST 명령에서 붙여 넣은 모든 코드는 잘 작동합니다.

ipython 모듈을 살펴 보셨습니까 (pydoc IPython)? 순수한 파이썬 코드를 통해 Ipython의 유틸리티에 액세스 할 수 있습니다.

할 수 있어요.

여기 예입니다.

이것은 A.ipy 파일의 내용입니다.

%run b.ipy

print(myvar)
print(myfunc())

이것은 B.ipy 파일의 내용입니다.

myvar = !echo 1

def myfunc():
  tmp_var = !echo 2
  return tmp_var

보시다시피 B.ipy 용도! 운영자. A.IPY를 실행하면 다음 결과가 나타납니다.

ipython a.ipy 
['1']
['2']

그래서, 당신은 "가져 오기" "모듈"당신이 파이썬으로하는 것과 같지 않지만 쉘에서하는 것처럼 source.

그러나 그것이 올바른 방법인지 확실하지 않습니다. 최소한 작동하며 공통 기능을 추출하여 다른 스크립트 파일에서 재사용 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top