6

これが私のコードです:

from distutils.msvc9compiler import MSVCCompiler

target_python_file = "main.py"
ccode = """#include <Python.h>

int
main(int argc, char *argv[])
{
  PyObject* PyFileObject;
  putenv("PYTHONPATH=lib");
  putenv("PYTHONHOME=.");
  Py_SetProgramName(argv[0]);
  Py_Initialize();
  PyFileObject = PyFile_FromString("%s", "r");
  PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "%s", 1);
  Py_Finalize();
  return 0;
}
""" % (target_python_file, target_python_file)

with open("main.c","w") as main:
    main.write(ccode)

compiler = MSVCCompiler()
compiler.compile(["main.c"],include_dirs=["C:/Python27/include"])
compiler.link("",["main.obj"],"python_launcher.exe",libraries=["python27"], library_dirs=["C:/Python27/libs"])

これを実行するとpython_launcher.exe表示されますが、実行しようとすると有効な win32 アプリケーションではありませんというエラーが表示されます。

Visaul C++ 2008 を使用して同じコードをコンパイルできますが、動作しますが、コンパイラの構成オプションを把握するために distutils を利用したいと考えています。

デバッグ

作成した実行ファイルを WinDebug で開こうとしたのですが、開けませんでした。 ここに画像の説明を入力

トルコ語の部分は、有効な Win32 アプリケーションではないと述べています。

4

1 に答える 1

0

コードを機能させるには、コードに次の 2 つの変更を加えます。

  1. link_executable を使用して、スタンドアロンの実行可能ファイルを出力します (compile.link() は役に立たないため、代わりにサブ関数を使用してください)。

    compiler.link_executable( ["main.obj"], #object
                               "launch"   , # strip the .exe extension, it will be added
                               libraries=["python27"],
                               library_dirs=["C:/Python27/libs"]
                             )            
    

    この時点で、次のエラー メッセージが表示されます。

    X:\dev\null>python_launcher.exe 
    ImportError: No module named site
    

これは、PYTHONPATH および PYTHONHOME 変数 env を入力しなかったためです。あなたの main.c で:

  1. ヴァレンヴ:

    putenv("PYTHONPATH=C:/Python27/Lib");
    putenv("PYTHONHOME=C:/Python27");
    

これらの修正で動作するはずです (Windows XP x86、Python 2.7、VSExpress 2008 でテスト済み)。

コード全体:

from distutils.msvc9compiler import MSVCCompiler

target_python_file = "main.py"
ccode = """#include <Python.h>

int
main(int argc, char *argv[])
{
  PyObject* PyFileObject;
  putenv("PYTHONPATH=C:/Python27/Lib");
  putenv("PYTHONHOME=C:/Python27");
  Py_SetProgramName(argv[0]);
  Py_Initialize();
  PyFileObject = PyFile_FromString("%s", "r");
  PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "%s", 1);
  Py_Finalize();
  return 0;
}
""" % (target_python_file, target_python_file)

with open("main.c","w") as main:
    main.write(ccode)

compiler = MSVCCompiler()
compiler.compile(["main.c"],include_dirs=["C:/Python27/include"])
compiler.link_executable(["main.obj"],"launch", libraries=["python27"], library_dirs=["C:/Python27/libs"]) 
于 2013-10-30T13:40:13.163 に答える