简体   繁体   English

Python 作为 C# 的构建后步骤

[英]Python as a post-build step to C#

I'm looking into ways to execute python as part of a C# build.我正在研究如何执行 python 作为 C# 构建的一部分。

Specifically, I want to create a Python package based on a C# project through python.net.具体来说,我想通过python.net基于C#项目创建一个Python package。 My general idea was to build the C# project first.我的总体思路是先构建 C# 项目。 And then, as some sort of post-build step, invoke python to build a package based on the newly generated NET assemblies.然后,作为某种后期构建步骤,调用 python 以基于新生成的 NET 程序集构建 package。

I can't presume python will installed on the build host, so ideally I want to include a "portable" - even more ideally, nuget-based - python distribution.我不能假设 python 会安装在构建主机上,所以理想情况下我想包括一个“便携式”——更理想的是,基于 nuget 的 python 分布。

I have found a promising nuget package , but am not entirely sure of its usage.我找到了一个很有前途的nuget package ,但我并不完全确定它的用法。 It incldues no C# code, but has all python binaries included, and has build props as copy/pasted below for reference.它不包括 C# 代码,但包含所有 python 二进制文件,并在下面复制/粘贴构建道具以供参考。

Given on that package's props - can I somehow reference its binaries from my own project as a post-build step?鉴于该包的道具 - 我可以以某种方式从我自己的项目中引用它的二进制文件作为构建后步骤吗?

Say, for example, I want to add a post-build step to my own project, that simply just invokes "python.exe" after the build.比如说,我想在我自己的项目中添加一个构建后步骤,它只是在构建之后调用“python.exe”。 How could I do that?我怎么能那样做?

My own project:我自己的项目:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <GenerateProgramFile>false</GenerateProgramFile>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="python" Version="3.10.0-a6" />
  </ItemGroup>
  
  <Target Name="MyCustomStep" AfterTargets="Build">
    <!-- .. now what? I can't seem to access. e.g. @(PythonHome) or $(PythonHome) from here --/>
  <Target>

</Project>

Props of the python package from nuget: nuget 的 python package 的道具:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="$(Platform) == 'X64'">
    <PythonHome Condition="$(PythonHome) == ''">$([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)\..\..\tools"))</PythonHome>
    <PythonInclude>$(PythonHome)\include</PythonInclude>
    <PythonLibs>$(PythonHome)\libs</PythonLibs>
    <PythonTag>3.10</PythonTag>
    <PythonVersion>3.10.0-a6</PythonVersion>

    <IncludePythonExe Condition="$(IncludePythonExe) == ''">true</IncludePythonExe>
    <IncludeDistutils Condition="$(IncludeDistutils) == ''">false</IncludeDistutils>
    <IncludeLib2To3 Condition="$(IncludeLib2To3) == ''">false</IncludeLib2To3>
    <IncludeVEnv Condition="$(IncludeVEnv) == ''">false</IncludeVEnv>

    <GetPythonRuntimeFilesDependsOn>_GetPythonRuntimeFilesDependsOn310_None;$(GetPythonRuntimeFilesDependsOn)</GetPythonRuntimeFilesDependsOn>
  </PropertyGroup>

  <ItemDefinitionGroup Condition="$(Platform) == 'X64'">
    <ClCompile>
      <AdditionalIncludeDirectories>$(PythonInclude);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
    </ClCompile>
    <Link>
      <AdditionalLibraryDirectories>$(PythonLibs);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>

  <Target Name="GetPythonRuntimeFiles" Returns="@(PythonRuntime)" DependsOnTargets="$(GetPythonRuntimeFilesDependsOn)" />

  <Target Name="_GetPythonRuntimeFilesDependsOn310_None" Returns="@(PythonRuntime)">
    <ItemGroup>
      <_PythonRuntimeExe Include="$(PythonHome)\python*.dll" />
      <_PythonRuntimeExe Include="$(PythonHome)\python*.exe" Condition="$(IncludePythonExe) == 'true'" />
      <_PythonRuntimeExe>
        <Link>%(Filename)%(Extension)</Link>
      </_PythonRuntimeExe>
      <_PythonRuntimeDlls Include="$(PythonHome)\DLLs\*.pyd" />
      <_PythonRuntimeDlls Include="$(PythonHome)\DLLs\*.dll" />
      <_PythonRuntimeDlls>
        <Link>DLLs\%(Filename)%(Extension)</Link>
      </_PythonRuntimeDlls>
      <_PythonRuntimeLib Include="$(PythonHome)\Lib\**\*" Exclude="$(PythonHome)\Lib\**\*.pyc;$(PythonHome)\Lib\site-packages\**\*" />
      <_PythonRuntimeLib Remove="$(PythonHome)\Lib\distutils\**\*" Condition="$(IncludeDistutils) != 'true'" />
      <_PythonRuntimeLib Remove="$(PythonHome)\Lib\lib2to3\**\*" Condition="$(IncludeLib2To3) != 'true'" />
      <_PythonRuntimeLib Remove="$(PythonHome)\Lib\ensurepip\**\*" Condition="$(IncludeVEnv) != 'true'" />
      <_PythonRuntimeLib Remove="$(PythonHome)\Lib\venv\**\*" Condition="$(IncludeVEnv) != 'true'" />
      <_PythonRuntimeLib>
        <Link>Lib\%(RecursiveDir)%(Filename)%(Extension)</Link>
      </_PythonRuntimeLib>
      <PythonRuntime Include="@(_PythonRuntimeExe);@(_PythonRuntimeDlls);@(_PythonRuntimeLib)" />
    </ItemGroup>

    <Message Importance="low" Text="Collected Python runtime from $(PythonHome):%0D%0A@(PythonRuntime->'  %(Link)','%0D%0A')" />
  </Target>
</Project>

That is for the use of internal nuget rather than your main project.那是为了使用内部 nuget 而不是你的主项目。 You cannot get that property under main project.您无法在主项目下获得该属性。

You have to use my function:你必须使用我的 function:

1) edit csproj file and set this for your PackageReference python 1)编辑csproj文件并将其设置为您的PackageReference python

 <GeneratePathProperty>true</GeneratePathProperty>

Like this:像这样:

 <ItemGroup>
    <PackageReference Include="python" Version="3.10.0-a6">
      <GeneratePathProperty>true</GeneratePathProperty>
    </PackageReference>
  </ItemGroup>

2) Then , you can use $(Pkgpython) to get that path. 2)然后,您可以使用$(Pkgpython)来获取该路径。

<Target Name="MyCustomStep" AfterTargets="Build">
    <Exec Command="$(Pkgpython)\tools\python.exe" />
</Target>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM