如何在 Linux 和 Windows 上调用 Python 3 脚本作为 CCS/Eclipse 构建步骤?

How can I invoke a Python 3 script as a CCS/Eclipse build step on both Linux and Windows?

我有一个 Python 3.5 脚本,我想在我的 Code Composer 构建中将其作为预构建步骤调用。明确地说,它应该是 运行 作为 (my project) > Properties > CCS Build > Steps > Pre-build steps.

中的条目之一

脚本当前以 hashbang #!/usr/bin/env python3 开头,但我可以更改它。

在 Linux,我可以调用脚本作为 ../prebuild.py ../output_file。这在 Windows 10 上失败了:

"C:\ti\ccsv6\utils\bin\gmake" -k all 
../prebuild.py ../output_file
makefile:217: recipe for target 'pre-build' failed
process_begin: CreateProcess(NULL, env python3 C:\path\to\prebuild.py ../output_file, ...) failed.
make (e=2): The system cannot find the file specified.

路径分隔符对此完全没有影响。

我也试过python3 ../prebuild.py ../output_file。这不适用于 Windows 10,因为没有 python3 可执行文件。 Python 3 安装为 python.exe。在 Linux 上使用 python 失败,因为当然 Python 3 安装为 python3,而 python 指的是 Python 2.

我也试过py ../prebuild.py ../output_file。这在 Linux 上失败,因为没有 py 可执行文件。

是否有跨平台的方法来调用可用于 Eclipse 预构建步骤的 Python 3 脚本?我想避免要求开发人员修改他们的 distribution/Python 安装。

我正在使用基于 Eclipse 的 Code Composer Studio 6。我希望对此的任何答案都适用。

上下文

我想要实现的其中一件事是将当前 Git 提交的 SHA1 插入到一个文件中。这样做的 accepted answer 是通过解析 Git 输出生成文件作为构建过程的一部分。我有一个 Python 脚本可以在 Windows 和 Linux 上执行此操作,因此我需要一种方法来调用它作为 Eclipse 构建过程的一部分。

有一个在 Python 2 和 3 下工作的包装脚本来检测和 运行 具有正确 Python 版本的脚本。 Eclipse/CCS 预构建步骤可以是 python ../wrapper.py(可能带有额外的参数,例如 ../prebuild.py args)。

您可以检查它是否在 Windows 或 Linux 上 运行ning 以及它是 运行ning 的哪个 Python 版本。如果是 运行ning on Linux 和 运行ning 错误的 Python 版本,运行 subprocess.call(['python3','prebuild.py'])。要检查 Python 版本和 OS 使用:

import os, sys, subprocess

if sys.version_info[0] < 3 and os.name == 'posix':
     subprocess.call(['python3','../prebuild.py'])
     sys.exit()
else:
    subprocess.call(['python','../prebuild.py'])
    sys.exit()

一个更通用的脚本可能 check if the interpreter 已经是正确的并尝试传递参数,如果它是:

import sys

if sys.version_info[0] >= 3 and sys.version_info[1] >= 3:
    subprocess.call([sys.executable] + sys.argv[1:]

否则,包装器可以迭代可能的解释器列表,直到成功,例如:

interpreters = [["py", "-3"], ["python3"]]

for interp in interpreters:
     # Try a subprocess.call(...) as above. Detect bad return codes (eg. py failed) or OSErrors (ie. command wasn't found).
     success = False
     try:
        success = subprocess.call(...) == 0
     except OSError:
         pass

     if success:
         break

在 CCStudio 6.1.2 和 6.2.0 之间,他们从 GNU make 3.81 切换到了 4.1。似乎这引入了 a feature that attempts to interpret the shebang 而不是仅仅将文件传递给 Windows 以通过 .py->py.exe 关联进行处理。

我不想仅仅因为 GNU make 太顽皮就更新各种项目和分支,所以我决定通过为 Windows 创建 env 来解决这个问题。好吧,它的最小版本可以满足我目前的需要 (python3)。由于 GNU make 在搜索匹配项时不会打扰我们 $PATHEXT 变量,我无法使用 env.py 并且除此之外它似乎甚至没有成功搜索它自己指定的列表以外的任何内容.exe。所以,C++ 是。如果我需要做更多的事情,我可能会让 env.exe 只调用 py env.py 并在 Python.

中完成剩下的工作

这是我简单的第一遍的副本 from my gist

#include <iostream>
#include <string>

using namespace std;

int main (int argc, char* argv[])
{
    string command = string("py");

    cout << " - - - - - - - \/  \/ - - - - - " << std::endl;
    for (int i = 2; i < argc; i++)
    {
        cout << argv[i] << endl;
        command += " ";
        command += '"';
        command += argv[i];
        command += '"';
    }
    cout << " - - - - - - - /\  /\ - - - - - " << std::endl;
    cout << command << endl;
    cout << " - - - - - - - /\  /\ - - - - - " << std::endl;

    system( command.c_str() );

    return 0;
}