使用完整路径运行脚本

时间:2018-11-02 19:48:45

标签: python bash sqlite

我有一个名为TEST的文件夹,里面有:

  • script.py
  • script.sh

bash文件是:

#!/bin/bash

# Run the python script
python script.py

如果我这样运行bash文件:

./TEST/script.sh

我遇到以下错误:

python: can't open file 'script.py': [Errno 2] No such file or directory

我该怎么做,告诉我的script.sh查看目录(可能会更改)并允许我在TEST目录中运行它?

棘手的是,我的python文件运行一个sqlite数据库,从文件夹外部调用脚本时遇到了同样的问题,它没有在文件夹内部查找数据库!

3 个答案:

答案 0 :(得分:2)

您可以使用$0(它是当前正在执行的程序的名称)和dirname(它提供文件路径的目录部分)的组合来确定路径(绝对或相对)在其下调用shell脚本。然后,您可以将其应用于python调用。

此示例对我有用:

$ t/t.sh
Hello, world!    
$ cat t/t.sh
#!/bin/bash
python "$(dirname $0)/t.py"

更进一步,更改您当前的工作目录,该目录也将被python继承,从而帮助其查找数据库:

$ t/t.sh; cat t/t.sh ; cat t/t.py ; cat t/message.txt
hello, world!

#!/bin/bash
cd "$(dirname $0)"
python t.py
with(open('message.txt')) as msgf:
  print(msgf.read())
hello, world!

答案 1 :(得分:2)

替代

通过将以下行添加到python文件的顶部,您可以直接运行脚本:

x

,然后使文件可执行:

u

这样,您可以直接使用#!/usr/bin/env python

运行脚本

您具体要求的内容

这可以获取脚本的路径,然后将其传递给python。

$ chmod +x script.py

也可能有用:

您提到在访问同一文件夹中的sqlite DB时遇到此问题,如果您是通过脚本运行此数据库来解决此问题,则它将无法正常工作。我想这个问题可能对您有用:How do I get the path of a the Python script I am running in?

答案 2 :(得分:1)

从shell脚本中,您始终可以找到当前目录:Getting the source directory of a Bash script from within。尽管该问题的公认答案提供了一个非常全面而可靠的解决方案,但您相对简单的案例实际上只需要

#!/bin/bash
dir="$(dirname "${BASH_SOURCE[0]}")"
# Run the python script
python "$(dir)"/script.py

另一种方法是更改​​运行脚本的目录:

#!/bin/bash
dir="$(dirname "${BASH_SOURCE[0]}")"
# Run the python script
(cd "$dir"; python script.py)

(...)cd周围的括号(python)创建了一个子进程,因此对于其余的bash脚本,目录不会更改。如果您不执行bash部分中的任何其他操作,则这可能不是必需的,但是如果您决定说出脚本的源代码而不是将其作为子进程运行,则仍然有用。

如果您不更改bash中的目录,则可以在Python中使用sys.argv\[0\]os.path.dirnameos.chdir的组合来完成此操作:

import sys
import os

...

os.chdir(os.path.dirname(sys.argv[0]))