【问题标题】:Bash script to pythonscript ConvertionBash 脚本到 python 脚本的转换
【发布时间】:2018-04-24 04:19:27
【问题描述】:

BASH 代码:

source /proj/common/tools/repo/etc/profile.d/repo.sh
repo project init $branch
repo project sync
source poky/fnc-init-build-env build
bitbake -g $image

我将此 bash 代码转换为 python(2.7 版)。在执行我的 python 代码时,我收到 repo command not found 消息。

Python 代码:

os.system("source /proj/common/tools/repo/etc/profile.d/repo.sh")
os.system("repo project init " + branch)
os.system("repo project sync")
os.system("source poky/fnc-init-build-env build")
os.chdir("poky/build")
os.system("bitbake -g " + image)

错误信息:

sh: repo: command not found
sh: repo: command not found

我尝试使用 subprocess.call(),我得到了同样的错误信息。

【问题讨论】:

  • 每个os.system 调用都会调用一个唯一的shell。 os.system("source ... 命令对与 os.system(" repo ... 一起使用的下一个 shell 没有影响。一般来说,除非你也重新实现repo.sh,否则你不会有运气。
  • 抛开子shell问题,这有什么意义呢?如果这是一个练习,恐怕你误会了。除非绝对必要,否则转换为 Python 脚本将涉及使用原始源代码对 os.system 进行零调用。就像在 Python 中不存在这样的库,编写一个库会非常昂贵。
  • 我尝试使用子进程。 subprocess.call(["source /proj/common/tools/repo/etc/profile.d/repo.sh", "repo project init" + 分支, "repo project sync","source poky/fnc-init-build -env build","bitbake -g " + image], shell=True)。它显示相同的错误消息

标签: python bash git python-2.7 shell


【解决方案1】:

问题出在这个调用中:

os.system("source /proj/common/tools/repo/etc/profile.d/repo.sh")

问题在于它在单独的子shell 中运行source,并且当子shell 退出对环境的所有更改时(cd 命令,如果有任何环境变量,最值得注意的是PATH)都消失了。

我的建议是继续使用您使用过的 shell 脚本 — 只需通过一个 os.system() 调用从 Python 调用它。在 shell 脚本中你可以使用source

【讨论】:

  • 当我在 python 交互模式下执行相同的命令时,有时它正在工作。有时它不起作用。我不知道为什么。
  • 取决于您在启动 Python 之前发送的 PATH 的值。
  • 当我在 bash 中执行“source poky/fnc-init-build-env build”时,poky build 中的目录将发生变化(即/data/users/dependencies/Lseries/poky/build)。但是当我在 python 中执行时,目录不会进入 poky/build.
【解决方案2】:

您至少可以使用 repo 命令的完整路径。

这将避免 subshel​​l 必须知道 repo 命令在哪里(意味着在每个 os.system 调用上设置正确的 PATH)。

【讨论】:

  • 我可以知道如何使用它
  • 在您的常规 shell 中,执行 which repo: 这将为您提供完整的使用路径。
  • 有没有办法使用python代码来执行这个功能
  • @sabarishs 在 python 中完成的 which 等效项是:stackoverflow.com/a/15133367/6309
  • 现在我收到错误,当我执行“os.system("bitbake -g fss-image-full-l100")”时。因为,目录不在“poky/build”内。请帮我解决这个问题
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2015-10-16
  • 2020-01-08
  • 2022-10-15
相关资源
最近更新 更多