Shell脚本:在Shell脚本中执行Python程序

238

我尝试过用谷歌搜索答案,但没有成功。

我需要使用公司的超级计算机服务器,但是为了运行我的Python脚本,必须通过shell脚本来执行。

例如,我想让job.sh执行python_script.py

这怎么实现呢?


2
你尝试过在你的shell脚本中只输入 python python_script.py 吗? - thkala
嗯,python python_script.py。如果脚本有shebang,也可以只用./python_script.py - user395760
2
@delnan:./python_script.py 还要求脚本是可执行的。 - thkala
你究竟尝试过什么,问题出在哪里?要么是你的谷歌搜索不够好,要么就是有很多信息你没有告诉我们... - thkala
4
这是一个相当古老的问题,但最好/最完整的答案来自João Víctor。一定要阅读到底部。 - Still.Tony
12个回答

284

确保Python可执行文件在您的PATH环境变量中,然后将其添加到您的脚本中即可。

python path/to/the/python_script.py

细节:

  • 在文件 job.sh 中,加入以下内容
#!/bin/sh
python python_script.py
执行此命令使脚本可以运行: chmod u+x job.sh 运行它: ./job.sh

5
这取决于你的系统。Python 3可能是默认的python运行时,也可能不是。你可以通过运行python --version来检查,也可以使用python3 hello.py来强制使用该版本。 - Jean-Bernard Jansen
如果无法找到已安装的依赖项,例如 pandas,应该怎么办? - mah65
这意味着您启动了错误的Python二进制文件或环境不正确。在这种情况下,您应该创建一个虚拟环境,然后运行 source PATH/TO/VENV/bin/activate,接着调用 python python_script.py - Jean-Bernard Jansen
我正在尝试在自动化程序中执行此操作,但是出现了错误:/path/to/Python: can't open file '/path/to/script': [Errno 1] Operation not permitted。有没有一种方法可以将我的Python代码嵌入到Bash脚本中? - Keyslinger

161

方法一 - 创建一个shell脚本:

假设你有一个Python文件 hello.py,创建一个名为job.sh的文件,其中包含以下内容:

#!/bin/bash
python hello.py

使用以下命令将其标记为可执行:

$ chmod +x job.sh

然后运行它

$ ./job.sh

方法二(更好)- 让Python本身从shell中运行:

修改您的脚本hello.py,并将以下内容添加为第一行:

#!/usr/bin/env python

使用以下命令将其标记为可执行:

$ chmod +x hello.py

然后运行它

$ ./hello.py

5
请编辑您的答案,使其更易读。您可以使用答案编辑器中的101010按钮将脚本内容标记为代码。 - thkala
1
我总是忘记 #!/usr/bin/env python。请确保您引用了适合您系统的正确Python版本和路径! - Still.Tony
请确保Python脚本与系统Python兼容,无需虚拟环境即可运行。 - Steven Scott

18

你应该能够通过 python scriptname.py 来调用它,例如:

# !/bin/bash

python /home/user/scriptname.py 

同时确保脚本具有运行权限。

您可以使用chmod u+x scriptname.py将其设置为可执行文件。


17

将以下程序保存为print.py

#!/usr/bin/python3
print('Hello World')

然后在终端中输入:

chmod +x print.py
./print.py

13

在我看来,编写

python /path/to/script.py

在今天来说,这种方式是相当错误的。你使用哪个版本的Python?是2.6、2.7、3.0还是3.1?大多数情况下,你需要在 Python 文件的 shebang 标签中指定 Python 版本。我鼓励使用

#!/usr/bin/env python2 # or python2.6 or python3,甚至是python3.1 
以保证兼容性。

在这种情况下,最好将脚本设置为可执行文件并直接调用它:

#!/bin/bash
/path/to/script.py

这样你所需的 Python 版本只需要在一个文件中写入。现在大多数操作系统都同时拥有 Python 2 和 Python 3,而且经常出现符号链接python指向python3,而很多人却期望它指向python2


1
你可以像 python script.py param 一样传递参数吗? - kristian
@kristian 是的 ./abc.py -h - user10481362

8
这对我来说有效:
1. 创建一个新的 shell 文件任务,比如: touch job.sh并添加运行 Python 脚本的命令(您甚至可以为该 Python 添加命令行参数,我通常会预定义我的命令行参数)。chmod +x job.sh 2. 在job.sh中添加以下 py 文件,比如: python_file.py argument1 argument2 argument3 >> testpy-output.txt && echo "Done with python_file.py"python_file1.py argument1 argument2 argument3 >> testpy-output.txt && echo "Done with python_file1.py" 3. 当我必须使用不同的预定义参数运行多个 Python 文件时,我通常会使用此方法。
注意:这里快速介绍一下正在发生的情况。
python_file.py argument1 argument2 argument3 >> testpy-output.txt && echo "completed with python_file.py" . 

  • 这里的shell脚本将运行文件python_file.py并在运行时添加多个命令行参数到python文件中。
  • 这并不意味着你必须传递命令行参数。
  • 你只需像这样使用:python python_file.py,简单明了。接下来,>>将打印并将此.py文件的输出存储在testpy-output.txt文件中。
  • &&是一个逻辑运算符,只有在上述成功执行后才会运行,并且作为可选项,echo“completed with python_file.py”将在运行时回显到您的cli/终端。

4
这对我来说是最好的方法: 在脚本顶部添加以下内容:
#!c:/Python27/python.exe

(C:\Python27\python.exe是我机器上python.exe的路径) 然后通过以下方式运行脚本:

chmod +x script-name.py && script-name.py

只是为了澄清,这是特定于Windows的。我使用的提示符是Git bash。我发现它非常有用,尤其是在Windows环境下。 - peterb

4

我使用这个并且它运行良好。

#/bin/bash
/usr/bin/python python python_script.py

2

由于其他帖子已经说得很清楚了(我在寻找以下内容时偶然发现了这篇文章)。
以下是一种从另一个Python脚本执行Python脚本的方法:

Python 2:

execfile("somefile.py", global_vars, local_vars)

Python 3:

with open("somefile.py") as f:
    code = compile(f.read(), "somefile.py", 'exec')
    exec(code, global_vars, local_vars)

你可以通过提供其他sys.argv来提供参数。


1
如果您有一个bash脚本,并且需要在其中运行一个带有外部模块的python3脚本,我建议您在bash脚本中指定您的python路径,如下所示。
#!/usr/bin/env bash

-- bash code --

/usr/bin/python3 your_python.py

-- bash code --

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接