문제

어떻게 실현 가능한 것을 컴파일하는 파이썬은(아마도를 통해 중간 표현 C)컴퓨터 코드?

아마도 그것은 필요가에 대한 링크를 Python 런타임 라이브러리,그리고 모든 부품의 Python 표준 라이브러리에서는 파이썬은 자신이 컴파일해야 합니(에 연결)너무입니다.

또한,당신은 필요가 번들의 파이썬 작업을 수행하려는 경우 동적인 평가의 표현,하지만 아마도 하위 집합의 Python 할 수 없게 하는 것이 여전히 유용합니다.

그것은 것을 제공하는 속도 및/또는 메모리 사용량이 장점?아마 시작 시간 Python 인터프리터의 제거 할 수 있다(하지만 공유 라이브러리는 여전히 필요 로드에서 시작).

도움이 되었습니까?

해결책

ShedSkin Python-to-C++컴파일러,하지만 그것까지 완벽입니다.또한이 사이코-파이 JIT 경우 속도가 필요합니다.하지만 이럴이지 않는 노력이 가치가 있습니다.에 대한 속도의 중요한 부분에 코드 최상의 솔루션을 작성하는 것입으로 그들을 C/C++확장.

다른 팁

로@그렉 Hewgill 것을 말해,좋은 이유가있다 왜 이것은 항상 그렇지는 않습니다.그러나,특정한 종류의 코드(매우 좋아하는 알고리즘 코드)설정할 수 있습으로"진짜"기계 코드입니다.

몇 가지 옵션이 있습니다:

  • 사이코, 을 방출하는 기계 코드를 동적으로.당신은 신중하게 선택해야한다는 방법/로 변환하는 기능을,하지만.
  • Cython, 는 파이썬- 언어로 컴파일되는 파이썬 C extension
  • 에는 디버깅 심볼이 들어, 는 번역가에서 RPython(a 제한 하위 집합 이 지원하지 않는 일부의 대부분의 동적 특징의 Python)해 C 또는 명령행 도구가 들어 있습니다.
    • 에는 디버깅 심볼이 들어 여전히 매우 실험
    • 모든 확장 될 것입니다 현재

그 후,당신은 중 하나를 사용할 수 있습니다 기존 패키지(동결,Py2exe,PyInstaller)모든 것을 넣어나 바이너리입니다.

모:일반적인 질문에 대한 답변.이 있는 경우 Python 코드는 성능이 중요한 시도로 사용하는 많은 내장 기능으로 가능한(요청"나는 어떻게 나이지 빠르게 질문에").도움이되지 않는 경우,시험을 식별 코드는 C(또는 Cython)사용 확장자.

py2c( http://code.google.com/p/py2c)으로 변환할 수 있는 파이썬 코드는 c/c++ 나는 솔로 개발자의 py2c.

Nuitka 는 파이썬 C++컴파일러는 링크에 대한 libpython.그것은 상대적으로 새로운 프로젝트입니다.저자는 주장 속도 개선 이 CPython 에 pystone 벤치마크입니다.

에는 디버깅 심볼이 들어 프로젝트를 구현하는 파이썬에서는 Python,를 사용하여 컴파일을 기본 코드의 하나로 구현 전략(다른 사람되고 있으로 VM JIT,를 사용하여 JVM,etc.).들이 컴파일된 C 버전을 실행보다 느리게 CPython 평균에 하지만 훨씬 더 빠르게 프로그램입니다.

Shedskin 실험 Python-to-C++컴파일러입니다.

Pyrex 는 언어를 위해 특별히 디자인 쓰 Python 확장 모듈이 있습니다.그것은 디자인의 격차를 해소 사이 좋은 높은 수준의,사용하기 쉬운 세계의이 지저분하다,낮은 수준의 세계 C.

Pyrex 하위 집합의 라이브러리가 들어 있는 컴파일을 C,에 의해 수행하는 사람을 먼저 내장 목록 함축 파이썬.그것은 주로 개발을 위해 구축 포장지만 사용될 수 있습에서 보다 일반적인 상황. Cython 는 더 적극적으로 유지 포크의 pyrex.

이 보일 수 있습니다 합리적인 첫눈에,그러나 많은 평범한 것에 Python 없는 직접 매핑 가능한 C 표현이 수행하지 않고 많은 Python 런타임 지원합니다.예를 들어 오리 입력하는 마음에 온다.많은 기능을에서는 파이썬 읽을 입력할 수 있는 파일 또는 파일과 같은 체로 특정 작업을 지원하,예를 들어,.read()또는 readline().당신이 생각하는 경우에 대해 어떤 것도 이러한 유형의 지원을 C,당신이 상상을 시작 정확히 종류의 것들을 Python 런타임 시스템 이미 않습니다.

가와 같은 유틸리티 py2exe 는 번들 Python 프로그램 및 런타임으로 단일 실행(까지 가능).

몇 가지 추가 참:

Jython 는 컴파일러 타겟팅 JVM 바이트 코드.바이트 코드는 완전히 동적처럼,파이썬다.아주 멋지다.(네,그렉 Hewgill 의 대답에 암시,바이트 코드를 사용하여 Jython 런타임,그리고 Jython jar 파일와 함께 배포할 수 있습니다.)

사이코 의 종류 just-in-time(JIT)컴파일러:동적 컴파일러를 위한 Python,실행 코드 2-100 번 더 빨리,하지만 그것이 필요한 많은 메모리입니다.

에서 짧은:실행하고 당신의 기존 Python 소프트웨어를 훨씬 더 빠르게 변화 없이 귀하의 소스만 컴파일하지 않을 개체 코드 같은 방법으로는 C 컴파일러는 것입니다.

대답은"예,가능한".당신이 걸릴 수 있다는 파이썬 코드고 시도로 컴파일 해당 C 코드를 사용하 CPython API 를 사용합니다.사실,거기에 사용되는 Python2C 프로젝트는 단지,하지만 난 그것에 대해 들어하지 않은 몇 년 동안에서(뒷면에는 파이썬 1.5 일은 때에 내가 마지막을 보았습니다.)

당신이 시도할 수 있습을 번역하는 파이썬 코드를 기본으로 C 가능한 한 많이,그리고 가을이 다시 CPython API 필요할 때 실제 Python 특징이다.나는 가지고 놀고 있는 아이디어 자신의 마지막 달입니다.그것은,그러나,많은 일,그리고 엄청난 양의 Python 특징은 매우 어려운 번역으로 C:중첩된 기능,발전기,아무것도 하지만 간단한 클래스는 간단한 방법으로,아무것도 포함하는 모듈을 수정하 globals 외부에서 모듈,etc.,etc.

이 컴파일하지 않는 파이썬을 컴퓨터 코드.하지만을 만들 수 있는 공유 라이브러리 호출하는 파이썬 코드입니다.

면 당신이 찾고있는 무엇이기 쉬운 방법을 실행하는 파이썬 코드에서는 C 에 의존하지 않고 execp 물건입니다.당신을 생성할 수 있는 공유 라이브러리에서는 파이썬 코드를 감싸는 몇 전화 Python 포함 API.아 응용 프로그램 공유 라이브러리다.그래서에 사용할 수 있는 다른 많은 라이브러리/응용 프로그램.

여기에 간단한 예제는 공유 라이브러리할 수 있는 링크는 C 프로그램입니다.공유 라이브러리는 실행하는 파이썬 코드입니다.

Python 는 파일을 실행될 것입니다 pythoncalledfromc.py:

# -*- encoding:utf-8 -*-
# this file must be named "pythoncalledfrom.py"

def main(string):  # args must a string
    print "python is called from c"
    print "string sent by «c» code is:"
    print string
    print "end of «c» code input"
    return 0xc0c4  # return something

당신은 그것을 시도할 수 있습니다진 python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO').출력됩니다:

python is called from c
string sent by «c» code is:
HELLO
end of «c» code input

공유 라이브러리에 의해 정의 될 수 있 다음 callpython.h:

#ifndef CALL_PYTHON
#define CALL_PYTHON

void callpython_init(void);
int callpython(char ** arguments);
void callpython_finalize(void);

#endif

관련 callpython.c 입니다:

// gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <python2.7/Python.h>

#include "callpython.h"

#define PYTHON_EXEC_STRING_LENGTH 52
#define PYTHON_EXEC_STRING "import pythoncalledfromc; pythoncalledfromc.main(\"%s\")"


void callpython_init(void) {
     Py_Initialize();
}

int callpython(char ** arguments) {
  int arguments_string_size = (int) strlen(*arguments);
  char * python_script_to_execute = malloc(arguments_string_size + PYTHON_EXEC_STRING_LENGTH);
  PyObject *__main__, *locals;
  PyObject * result = NULL;

  if (python_script_to_execute == NULL)
    return -1;

  __main__ = PyImport_AddModule("__main__");
  if (__main__ == NULL)
    return -1;

  locals = PyModule_GetDict(__main__);

  sprintf(python_script_to_execute, PYTHON_EXEC_STRING, *arguments);
  result = PyRun_String(python_script_to_execute, Py_file_input, locals, locals);
  if(result == NULL)
    return -1;
  return 0;
}

void callpython_finalize(void) {
  Py_Finalize();
}

컴파일할 수 있습니다 다음 명령을 사용:

gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so

파일을 만들라는 이름 callpythonfromc.c 는 포함된 항목은 다음과 같습니다.

#include "callpython.h"

int main(void) {
  char * example = "HELLO";
  callpython_init();
  callpython(&example);
  callpython_finalize();
  return 0;
}

컴파일과 실행:

gcc callpythonfromc.c callpython.so -o callpythonfromc
PYTHONPATH=`pwd` LD_LIBRARY_PATH=`pwd` ./callpythonfromc

이는 매우 기본적인 예이다.작동할 수 있지만,그에 따라 도서관 수 있습 아직도 어려운 serialize C 데이터 구조를 Python,Python C.것을 자동화할 수 있습은 다소...

Nuitka 는 것이 도움이 될 수도 있습니다.

또한 거 numba 하지만 그들은 모두 하지 않 작업을 수행하는 것을 목표로하고 당신이 원하는 무슨 정확합니다.생성한 C 헤더에서는 파이썬 코드가 가능 하지만,지정하는 경우에만 어떻게 변환하는 파이썬은 종류의 C 형식 또는 유추할 수 있는 정보입니다.보 python 별 모양 에 대한 Python ast 분석기입니다.

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