我有一个名为TEST的文件夹,里面有:
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数据库,从文件夹外部调用脚本时遇到了同样的问题,它没有在文件夹内部查找数据库!
答案 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.dirname
和os.chdir
的组合来完成此操作:
import sys
import os
...
os.chdir(os.path.dirname(sys.argv[0]))