路径变量和脚本的 shebang 将无法运行正确版本的 python

路径变量和脚本的 shebang 将无法运行正确版本的 python

问题陈述:

bash 脚本用于为名称列表中的每个名称创建一个新的屏幕会话。对于每个名称,都会使用该名称作为输入来运行 python 脚本。 bash 脚本设置包含正确版本的 python 的路径(anaconda 包中的 python 3):

#!/bin/sh

export PATH=~/anaconda3/bin/python:$PATH

while read p; do
  screen -dm -S $p bash -c "cd /inside/home/thjmatth/essential; python3 essentialpairs_ttest_tissue_1.py; exec sh"
done <cells.txt

如上所述设置路径不允许运行正确版本的 python,因此我将以下 shebang 添加到要运行的 python 脚本中:

#!~/anaconda3/bin/python python3

仍然没有骰子:/usr/bin/python在不应该使用的时候仍然被使用。如何让这个程序根据我指定的路径运行python的版本?

尝试1:

新舍邦:

#!/inside/home/thjmatth/anaconda3/bin/python/

新的 bash 脚本:

#!/bin/sh

export PATH=~/anaconda3/bin/python:$PATH

while read p; do
  screen -dm -S $p bash -c "cd /inside/home/thjmatth/essential; python3 essentialpairs_ttest_tissue_1.py; exec sh"
done <cells.txt

python 脚本的新权限:

chmod +x essentialpairs_ttest_tissue_1.py

错误:

bash: python3: command not found

在该屏幕中运行 which python 仍然显示/usr/bin/python

解决方案:

与上面的尝试 1 相同,但更改了 bash 脚本的第 3 行,使其成为目录而不是可执行文件:

export PATH=~/anaconda3/bin/python:$PATH

答案1

export PATH=~/anaconda3/bin/python:$PATH

这看起来像是可执行文件的路径。PATH应包含目录:

export PATH=~/anaconda3/bin:$PATH

#!~/anaconda3/bin/python python3
  1. Shebang 线需要实际路径并且不执行波形符扩展(那是在你的外壳中)。写入可执行文件的实际路径,以/.
  2. ~/anaconda3/bin/python该 shebang 行将使用参数运行python3,后跟脚本名称。您可能不希望这样,而是运行pythonor python3

    #!/home/thomas/anaconda3/bin/python
    

screen -dm -S $p bash -c "cd /inside/home/thjmatth/essential; python3 essentialpairs_ttest_tissue_1.py; exec sh"

如果您在更新 shebang 行后仍在运行此行,它将被忽略;来自python3您的PATH(与!不同python)将被执行并依次运行脚本,并且将跳过 shebang 行作为注释。如果使脚本可执行(chmod +x essentialpairs_ttest_tissue_1.py),则可以直接运行它:

./essentialpairs_ttest_tissue_1.py

并且 shebang 线将被处理。


在这种情况下,您可以大概除非您有重置变量的 Bash 启动配置,否则只需修复PATH第一部分中的变量即可。如果可执行文件名称为python,请确保更新screen命令行以使用该名称python3

答案2

可能的解决方案

关于你的第二次尝试,使用 python 脚本中的 shebang:

  • 你不能~在 shebang 中使用;它必须是实际路径 ( #!/inside/home/thjmatth/...)。
  • 目录名和程序名之间不能有空格;它一定要是#!/inside/home/thjmatth/anaconda3/bin/python/python3

完整性检查:您是否有一个名为 的目录 /inside/home/thjmatth/anaconda3/bin/python,其中包含名为 的可执行程序python3 (即解释程序的完整路径名是 /inside/home/thjmatth/anaconda3/bin/python/python3

值得尝试的东西

更改您的脚本来执行此操作:

#!/bin/sh

export PATH=~/anaconda3/bin/python:$PATH

while read p; do
  type python3
  screen -dm -S "$p" bash -c "type python3; exec sh"
done <cells.txt

看看你是否能弄清楚发生了什么。如果您仍然遇到困难,请编辑您的问题以包含上述输出。

另一件事: 您应该始终引用对 shell 变量的所有引用(例如,"$p"),除非您有充分的理由不这样做,并且您确定您知道自己在做什么。

相关内容