Python脚本在命令行上运行,但不是从.sh文件运行

时间:2019-08-23 11:04:17

标签: python bash

我正在尝试创建一个.sh文件,以便在假期期间在Python上批量运行神经网络。

此刻,我已经从命令行调用了此命令:

python neural_network_trainer.py [args]

我现在编写了一个.sh脚本:

#!/bin/bash

python neural_network_trainer.py [args]

# Repeated with varied args

我试图在与原始命令行运行相同的终端中进行调用:

./august_hols.sh

我收到以下错误:

File "/data/Python-3.6.9/lib/python3.6/site.py", line 177
file=sys.stderr)
    ^
SyntaxError: invalid syntax

(由于某些原因)Python安装位于/ data中。

在命令行上运行which报告通过~/.bashrc中的别名设置的正确Python目录:

alias python=/data/Python-3.6.9/bin/python3

但是在Bash shebang和第一个python调用报告which之间运行/bin/python

我试图在.sh脚本的开头再次设置别名无效。我挠头,因为这是我在其他地方使用过的确切过程,尽管不在此精确PC上。我可以将确切的命令从bash文件的顶部复制到终端中,并且可以正常运行,尝试调用./august_hols.sh并获得上述Python错误。

Bash从何处获取该路径,为什么它不使用我预期的通过〜/ .bashrc的路由?

5 个答案:

答案 0 :(得分:2)

Bash子Shell在主Shell中不继承别名

您可以获取脚本(在主外壳中运行),而不是执行脚本(在子外壳中运行)

  

源script.sh

编辑:

解决方案2:

运行bash作为登录shell,以便执行〜/ .bashrc,以便在脚本之前加载别名。

子外壳需要是交互式的才能启用别名,因为默认情况下仅对交互式外壳启用别名,而脚本默认情况下是非交互式的。

  

bash --login -i script.sh

解决方案3:

与上述类似,但显式启用了别名

  

bash --login -O expand_aliases script.sh

答案 1 :(得分:0)

您尝试过吗:

python=/data/Python-3.6.9/bin/python3 ./[your_bash].sh

答案 2 :(得分:0)

在您的.sh

这样做

#!/usr/bin/env bash
export PATH=/data/Python-3.6.9/bin:$PATH
exec python neural_network_trainer.py "$@"

别名是棘手的。

答案 3 :(得分:0)

也许更讨厌的解决方案

mapfile < <(declare -p | grep -m 1 BASH_ALIASES) && bash script.sh "${MAPFILE[@]}"

您将需要在脚本中

shopt -s expand_aliases
eval $1
echo ${BASH_ALIASES[python]}
python --version

答案 4 :(得分:0)

如何?

#!/bin/bash

/data/Python-3.6.9/bin/python3 neural_network_trainer.py [args]

# Repeated with varied args