【问题标题】:Shell Script: Execute a python program from within a shell scriptShell 脚本:从 shell 脚本中执行 python 程序
【发布时间】:2011-05-21 14:21:04
【问题描述】:

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

我需要使用我的作品超级计算机服务器,但是要运行我的python脚本,它必须通过shell脚本执行。

比如我想让job.sh执行python_script.py

如何做到这一点?

【问题讨论】:

  • 你试过把python python_script.py放在你的shell脚本里吗?
  • 嗯,python python_script.py。或者只是./python_script.py,如果脚本有一个shebang。
  • @delnan: ./python_script.py 还要求脚本是可执行的
  • 您到底尝试了什么,有什么问题?要么你没有在谷歌搜索上做得那么好,要么你没有告诉我们很多......
  • 这是一个相当古老的问题,但最好/最完整的答案是 João Víctor 提出的。请务必仔细阅读。

标签: python shell


【解决方案1】:

只需确保 python 可执行文件在您的 PATH 环境变量中,然后添加到您的脚本中

python path/to/the/python_script.py

详情:

  • 在文件job.sh中,放这个
#!/bin/sh
python python_script.py
  • 执行此命令使脚本可以为您运行:chmod u+x job.sh
  • 运行它:./job.sh

【讨论】:

  • 这取决于您的系统。 Python 3 可能是默认的 Python 运行时,也可能不是。您可以通过运行python --version 进行检查,您可以使用python3 hello.py 强制执行版本。
  • 没有找到已经安装好的导入,比如pandas怎么办?
  • 这意味着你启动了错误的python二进制文件或环境不正确。在这种情况下,您应该填充一个 virtualenv,然后运行 ​​source PATH/TO/VENV/bin/activate 然后调用 python python_script.py
  • 我正在尝试在 automator 中执行此操作,但出现错误; /path/to/Python: can't open file '/path/to/script': [Errno 1] Operation not permitted 有没有办法将我的 python 代码内嵌在 bash 脚本中?
【解决方案2】:

您应该能够以python scriptname.py 的形式调用它,例如

# !/bin/bash

python /home/user/scriptname.py 

还要确保脚本有运行权限。

您可以使用chmod u+x scriptname.py 使其可执行。

【讨论】:

    【解决方案3】:

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

    假设你有一个python文件hello.py 创建一个名为job.sh的文件,其中包含

    #!/bin/bash
    python hello.py
    

    使用标记它可执行

    $ chmod +x job.sh
    

    然后运行它

    $ ./job.sh
    

    方法 2(更好) - 让 python 本身从 shell 运行:

    修改您的脚本hello.py 并将其添加为第一行

    #!/usr/bin/env python
    

    使用标记它可执行

    $ chmod +x hello.py
    

    然后运行它

    $ ./hello.py
    

    【讨论】:

    • 请编辑您的答案以使其更具可读性。您可以使用答案编辑器中的 101010 按钮将脚本内容标记为代码。
    • 我总是忘记#!/usr/bin/env python。请记住确保您为系统引用了正确的 python 版本 + 路径!
    【解决方案4】:

    恕我直言,写作

    python /path/to/script.py
    

    这是完全错误的,尤其是在这些日子里。哪条蟒蛇?蟒蛇2.6? 2.7? 3.0? 3.1?大多数情况下,您需要在 python 文件的 shebang 标记中指定 python 版本。我鼓励使用

    #!/usr/bin/env python2 #or python2.6 or python3 or even python3.1
    为了兼容性。

    在这种情况下,最好让脚本可执行并直接调用它:

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

    这样你需要的python版本只写在一个文件里。现在大多数系统同时有python2和python3,而符号链接python恰好指向python3,而大多数人期望它指向python2

    【讨论】:

    • 你能像python script.py param一样传递参数吗?
    • @kristian 是的 ./abc.py -h
    【解决方案5】:

    这对我最有效: 在脚本顶部添加:

    #!c:/Python27/python.exe
    

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

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

    【讨论】:

    • 澄清一下,这是特定于 Windows 的。我使用的提示是 Git bash。我觉得它超级有用。尤其是在Windows环境中
    【解决方案6】:

    这对我有用:

    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"

    job.sh 的输出应如下所示:

    Done with python_file.py

    Done with python_file1.py

    当我必须运行多个具有不同参数的 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 “用 python_file.py 完成”将回显到您的 cli/终端在运行时。

    【讨论】:

      【解决方案7】:

      我用这个,效果很好

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

      【讨论】:

        【解决方案8】:

        将以下程序另存为print.py

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

        然后在终端输入:

        chmod +x print.py
        ./print.py
        

        【讨论】:

          【解决方案9】:

          因为其他帖子说明了一切(我在寻找以下内容时偶然发现了这篇帖子)。
          这是一种如何从另一个 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 来提供参数

          【讨论】:

            最近更新 更多