2

我有一个 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 脚本?我想避免要求开发人员修改他们的发行版/Python 安装。

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

语境

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

4

2 回答 2

2

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

你可以检查它是在 Windows 还是 Linux 上运行,以及它运行的是什么版本的 Python。如果它在 Linux 上运行并运行错误的 Python 版本,请运行subprocess.call(['python3','prebuild.py']). 要检查 Python 版本和操作系统,请使用:

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()

一个更通用的脚本可能会检查解释器是否已经是正确的,如果是,则尝试传递参数:

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
于 2016-08-21T17:34:02.137 回答
0

在 CCStudio 6.1.2 和 6.2.0 之间的某个地方,他们从 GNU make 3.81 切换到 4.1。似乎这引入了一个试图解释 shebang 的功能,而不是仅仅将文件传递给 Windows 以通过.py->py.exe关联进行处理。

我不想仅仅因为 GNU make 很顽皮而更新各种项目和分支,所以我决定通过env为 Windows 创建以稍微不同的方向解决这个问题。好吧,它的最小版本可以满足我目前的需求(python3)。$PATHEXT由于 GNU make在搜索我无法使用的匹配项时不会打扰我们的变量env.py,除此之外,它甚至似乎都没有成功地在它自己指定的列表中搜索除.exe. 所以,C++就是这样。如果我需要做更多事情,我可能会env.exe打电话py env.py并用 Python 完成其余的工作。

这是我的 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;
}
于 2017-01-27T21:23:33.620 回答