2012-11-28 2 views
1

누구나 이와 같은 것을 시도해보고이 아이디어를 추구할지 여부에 대한 조언을 얻고 싶습니다. 나는 DLL을 만들고 싶습니다 Python 스크립트가 있습니다. 몇 가지 조사를 한 후에이 작업을 수행하는 가장 좋은 방법은 Python 스크립트를 C에 포함시킨 다음 C 코드에서 dll을 생성하는 것입니다.Elmer를 사용하여 C 코드를 생성 한 다음 DLL을 작성하십시오.

나는 Elmer Software Glue : http://elmer.sourceforge.net/index.html을 발견했다. Python 모듈을 C에 내장하고있다.

나는 누군가가 나에게이 방법이 효과가 있는지, 어쩌면 몇 가지 대안이 있는지에 대해 확신을 줄 것이다. 나는 모든 제안에 열려 있습니다.

답변

1

잘 모르겠지만 Elmer를 사용하여 Elmer를 사용하여 Python 2.7.8 및 Elmer 1.1.7a를 사용하여 Windows 7 x64에서 DLL을 만들 수있었습니다. 나는 내 경험을 나눌거야.

내 컴파일/환경을 구축이 VisualStudio2005 NMAKE

나는 특히 언 플래그 관련, 길을 따라 몇 가지 문제로 실행 않았다 비주얼 스튜디오 내 이전 버전을 사용 되었으나, 나는 것으로 보이는 무엇입니까 지금 작업중인 DLL.

내 최고 수준의 노트 :

내가 정적으로 인해 python27.dll가 포함 된 MSVCRT90와 DLL을 로딩하는 동안 충돌 MSVCRT80와 엘머 연결했다
  • .
  • 라이브러리 elmer.lib가 연결 단계에 필요했지만 c : \ elmer \ src \ build \ temp.win32-2.7 \ Release \ elmer 디렉토리에만 존재 했으므로 복사해야하는 것처럼 보입니다. 이름에 temp라는 단어가 없지만 임시 디렉토리에서 makefile을 사용하도록 설정했습니다.
  • -frozen을 사용할 때 수십개의 생성 된 .c 파일이있을 수 있습니다.
  • PyImport_FrozenModules 및 Py_FrozenFlag는 이미 다른 포함 파일 (pydebug)에 의해 선언되었습니다.
  • 방금 ​​할당 된 것이 아니라 PyImport_FrozenModules가 재정의되고 있습니다 (elPythonToC로 인해).
  • DL_IMPORT (elPythonToC.py에서 사용됨)는 http://bugs.python.org/issue566100에 대해 사용되지 않습니다. 대신 PyApi_DATA를 사용해야한다고 생각하지만 실제적인 차이는 없습니다. EDIT PyImport_FrozenModules를 재정의 할 때 전체 블록을 삭제할 때 그다지 중요하지 않습니다.
  • 결국 python27.dll, elmer.dll을 포함해야했습니다. MSVCRT90.dll도 python27.dll이 필요하므로 대상 컴퓨터에 MS 재배포 가능 설치 프로그램을 통해 설치해야한다고 생각합니다. 냉동을 사용하면 단 하나의 배포 가능 제품을 얻게된다면 좋겠지 만 내가 얻을 수있는 것을 취할 것입니다.
  • 약간의 수정 (예 : 파이썬 경로가 c : \ python27 대신 c : \ python26)으로 파이썬 2.6.5에서 프로 시저를 실행할 수있었습니다.
  • 먼저 python으로 스크립트를 테스트하십시오. elmer는 기형적 인 python이 포함 된 스크립트를 기꺼이 패키지합니다.
  • 는 디버그 할 DLL을 만들 파이썬 코드 자체에서 포맷 된 의견이나 기능의 어떤 종류가에서 .elm 파일을 대체 할 수 있다면
  • 좋은하여야 할 LINKFLAGS에 CFLAGS에 /Z7 /Od/incremental:no /debug을 추가합니다.

지금 여기에 자세한 단계는 내가 한의입니다 (이 중 하나라도 정확하고 확실하게 최적화되지 않았 음을 보증없이,하지만 그들은 나를 위해 작동하는 것 않았다) :

  • 는 엘머 설치
  • 내가 시작
  • , 나는 2.7.2를 사용하고 있었고, 난이 문제로 실행 :
    • 다운로드 및 일부 디렉토리 엘머 압축을 풉니 다 (엘머 \, 그래서 난 내 예를 걸쳐 것을 사용합니다 나는 C를 포착) : Compiling with cython and mingw produces gcc: error: unrecognized command line option '-mno-cygwin' . Lib/distutils/cygwinccompiler.py를 -mno-cygwin을 제거하도록 설치하고 설치했지만 나중에 2.7.8을 설치했는데 근본적인 문제를 수정했다고 생각합니다.
    • 이전 버전의 MSVCRT를 가지고 있기 때문에 Elmer.dll이 MSVCRT 정크에 정적으로 링크되기를 원했기 때문에 setup.py를 다음과 같이 수정했습니다. (내가 정적으로 연결하지 말아야 알고 당신은 아마 그것을 원하지 않지만, 경우에 당신이 :
    • 윈도우 - 특정 빌드 옵션에서 libDirs = [] 선언 아래
    • extraCompileArgs = []extraLinkArgs = [] 추가 블록 추가하는 경우 : extraCompileArgs = ['/MT']extraLinkArgs = ['/MANIFEST']
    • , 명령 프롬프트에서 Setup(..., ext_modules=[Extension(
    • 내부 libraries=libs 후에 실행 C를 , extra_compile_args=extraCompileArgs, extra_link_args=extraLinkArgs 추가 : \ 엘머 \ SRC> 파이썬, 명령 프롬프트에서
    • 실행 C를 건설있는 setup.py : \ 엘머 \ SRC> 파이썬 setup.py
    • 설치
    은 는
  • 은 수정 평 내 요구에 맞게에서 .elm - 파일 - 언 옵션을 사용할 때
  • makefrozen.py makefrozen를 얻는 엘머에서 사용하는 쉬운 부분이었다, 그러나이 표시되지 않습니다에 포함 할 표준 win32 MSI 배포판.
    • makefrozen는 파이썬의 소스 코드에 포함되어 있지만, 윈도우 MSI 인스톨러에 포함되지 않은, 그래서 \ www.python.org
    • 추출 \ 도구에서 소스 TAR 파일을 다운로드 C에 \ 동결 : \ python27
    • 경로 SET PATH=%PATH%;%ELMERDIR%;%THISDIR%
    • 을 가리켜 야 \ : \ 도구는 C에
  • 수정 buildAndRun
    • 변경 ELMERDIR을 동결 \ C에
    • 설정 ELMERDIR는 : \ 엘머 업데이트 파일 내 구성에 대해 작업 할 수
  • \는 (예제 파일은 NMAKE 또는 냉동와 전혀 작동하지 않았다).

    PYTHONDIR=C:\Python27 
        ELMERDIR=C:\elmer 
        ELMERLIBDIR=$(ELMERDIR)\src\build\temp.win32-2.7\Release\elmer 
        ELMER_OUTPUT_DIR=Generated 
    
        CC=cl 
        RM=del /F /Q 
        ELMER=$(ELMERDIR)\elmer 
        shell=call 
    
        CFLAGS=/TC /LD 
        INCLUDEFLAGS=/I$(ELMER_OUTPUT_DIR) /I$(PYTHONDIR)\include /I$(PYTHONDIR)\Lib\site-packages\elmer 
        LINKFLAGS=/LIBPATH:$(PYTHONDIR)\libs python27.lib /LIBPATH:$(ELMERLIBDIR) elmer.lib 
    
        .PHONY: generatedFiles generatedFrozen all allFrozen 
        SRCS = Generated\*.c 
        OBS = $(SRCS:.c=.obj) 
    
        {Generated}.c{Generated}.obj:: 
         @echo Compiling... 
         @$(CC) /nologo $(CFLAGS) $(INCLUDEFLAGS) /c /FoGenerated\ $< 
    
        generatedFrozen: 
         echo Elmering 
         @$(shell) $(ELMER) -c -frozen -o $(ELMER_OUTPUT_DIR) -int MyDll.elm MyDll.py 
    
        generatedFiles: 
         echo Elmering 
         @$(shell) $(ELMER) -c -o $(ELMER_OUTPUT_DIR) -int MyDll.elm MyDll.py 
    
        showIncludeAndLinkFlags: 
         @echo includeDirs: 
         @$(shell) $(ELMER) --printIncludeFlags 
         @echo linkDirs: 
         @$(shell) $(ELMER) --printLinkFlags 
    
        MyDll.dll: $(OBS) 
         @echo Linking... 
         @Link $(LINKFLAGS) /DLL $(OBS) 
    
        all: 
         @echo "Making All" 
         @nmake generatedFiles 
         @nmake showIncludeAndLinkFlags 
         @nmake MyDll.dll 
    
        allFrozen: 
         @echo "Making All" 
         @nmake generatedFrozen 
         @nmake showIncludeAndLinkFlags 
         @nmake MyDll.dll 
    
        clean: 
         @echo cleaning 
         $(RM) .\Generated\*.* 2>nul || echo eatFailure >nul 
    
  • 이 NMAKE를 호출하기 전에 설정에 비주얼 스튜디오 환경을 경우 build.bat 만들기 : 여기에 NMAKE를 사용하여 냉동 또는 비 냉동 버전을 구축 할 수 있습니다 내 MAKEFILE입니다.여기 내 빌드 배치 파일의 내용은 다음과 같습니다

    @ECHO OFF 
        SETLOCAL 
        SET THISDIR=%~dp0 
        REM Setup Visual Studio build environment 
        REM Microsoft Visual Studio 8 == Visual Studio 2005 
        CALL "C:\Program Files (x86)\Microsoft Visual Studio 8\VC\vcvarsall.bat" 
        nmake clean 
        nmake allFrozen 
        pause 
        ENDLOCAL 
    
  • 수정 컴파일/링크 오류, 내가 그것을
    • 일 중복 선언을 제거하는 얻을 코드를 엘머 수정했다 여기 추악한 조금 가지고와 Py_FrozenFlag 및 PyImport_FrozenModules
      • 열기 C에 대한 재정의 : \ python27 \ lib 디렉토리 \ 사이트 - 패키지 \ 엘머 \ elPythonToC.py을 텍스트 또는 파이썬 편집기에서
      • 삭제 또는 0123을 포함하는 if(frozenFlag) : 블록을 주석및 retCode += "DL_IMPORT(struct _frozen *) PyImport_FrozenModules;\n" (라인 145 정도)
      • 라인을 추가 retCode += " PyImport_FrozenModules = _PyImport_FrozenModules;\n"을 포함하는 선 위에 retCode += " retRunVal = PyImport_ImportFrozenModule((char*)\"%s\");\n" (라인 189)
  • 메일 폴더
  • 복사 된 DLL
    • 복사 MyDLL.dll .elm 파일이 들어있는 작업 디렉토리에서. C : \ elmer \ src \ build \ lib.win32-2.6 \ elmer에서 elmer.dll을 복사하십시오. C : \ Windows \ SysWOW64에서 python27.dll을 복사하십시오.
    • 옆 DLL에. http://msdn.microsoft.com/en-us/library/vstudio/ms235299.aspx를 참조하는 병렬 구성과 물건을 대상 시스템에 필요한 (또는 어쩌면 당신의 창에 MSVCRT90.dll을 찾을 경우 비주얼 C++ 재배포 가능 패키지를 설치합니다.

내 DLL에 약간의 고기를 추가하면

편집 , 나는 냉동 수입 물건이 제대로 작동하지 않는 눈치과 종료 내 DLL을 일으키는 원인이되었다. 내 원래 수정 Py_FrozenFlag 및 PyImport_FrozenModules의 원인이 된 로컬로 정의 할 수, 발생하는 PyImpor t_ImportFrozenModule이 생성 된 C 코드 내에서 실패합니다. makefile을 수정하여 Py_NO_ENABLE_SHARED 정의를 제거하고 정의 및 선언을 제거하고 PyImport_FrozenModules의 정의를 할당으로 변경했으며 모든 것이 올바르게 작동하는 것처럼 보입니다. 성공적으로 연결하고 간단한 C++ 응용 프로그램에서 내 DLL을 디버깅했습니다.

관련 문제