【问题标题】:how to run python script without typing 'python ...'如何在不输入'python ...'的情况下运行python脚本
【发布时间】:2011-06-26 23:44:35
【问题描述】:

我想运行一个 python 脚本,而不必每次都在我的 shell 中显式调用“python”。我尝试添加 shebang #!/path/to/python 但这似乎不起作用。有谁知道解决这个问题?非常感谢。

【问题讨论】:

  • “这似乎不起作用。”该问题似乎没有特定的错误消息。如果没有具体的错误,我们似乎无法猜测出了什么问题。
  • 它被称为 shebang #!/usr/bin/python
  • 同样 'chmod a+x' 文件,并将目录添加到 PATH
  • 你的 DE 是哪个?
  • 有人能解释一下PATH是什么吗?以及如何将我的目录添加到其中?

标签: python bash shell


【解决方案1】:

你必须添加shebang:

#!/usr/bin/env python

然后使脚本可执行:

chmod +x foo

然后你可以像运行任何其他可执行文件一样运行它:

./foo

还有来自 Homer6 的注释:如果您从 windows 编辑文件并在 linux 上调用它,您可能会遇到神秘的“没有这样的文件或目录”错误。这是由于行的行尾是 CRLF 而不是 LF。如果将它们转换为 LF,脚本将按预期执行。 Notepad++ > 查看 > 显示符号 > 显示行尾以显示 EOL 字符。并且 Notepad++ > Edit > EOL Conversion > Unix Format 将所有行尾转换为使用 LF。或者,您可以使用大多数 Linux 系统上提供的dos2unix 工具 (dos2unix foo.py)。

【讨论】:

  • 附带说明:使用/usr/bin/env 比使用shebang 行中的Python 路径更好:如果您硬编码路径,如果Python 被移动,脚本将停止工作……但是只要 Python 在 $PATH 上,/usr/bin/env 就可以工作。
  • 好吧,严格来说,env 也可以位于其他地方。但是,是的,这比在碰巧将 python 放在其他地方的其他发行版上运行脚本的可能性要小得多。
  • 确实如此。但我不知道有任何其他更便携的方法。
  • 另一个注意事项:如果您从 windows 编辑文件并在 linux 上调用它,您可能会遇到神秘的“:没有这样的文件或目录”错误。这是由于行的行尾是 CRLF 而不是 LF。如果将它们转换为 LF,脚本将按预期执行。 Notepad++ > 查看 > 显示符号 > 显示行尾以显示 EOL 字符。和 Notepad++ > Edit > EOL Conversion > Unix Format 将所有行尾转换为使用 LF。
  • 在 gvim for windows 上,我认为 :set ff=unix 然后保存解决了这个问题。
【解决方案2】:

确保您能够在终端上运行 /path/to/python。并确保您已授予您的 python 文件的执行权限。您可以通过

授予该文件的权限
chmod +x mypythonfile.py

【讨论】:

  • 这有点晚了,但是我应该把 chmod 命令放在哪里...在命令提示符下?谢谢
  • @lucyb 是的,chmod 是一个 Unix 命令,您通常会在 shell 提示符下键入它。
【解决方案3】:
  1. 在脚本顶部添加一行:

    #! /usr/bin/env python
    
  2. 将脚本从 script_name.py 重命名为 script_name
  3. 使脚本可执行:chmod +x script_name

顶部的行选择与在提示符下键入 python 时相同的 python。也可以指定直接路径:

#!/opt/python/3.6/bin/python

【讨论】:

  • 另外,需要将脚本的位置添加到PATH变量中。否则你需要将它作为 ./script_name 执行
  • 您为什么建议更改文件名?不这样做有什么影响吗?
  • @VishalSingh 后果是您必须输入三个额外的字符才能调用脚本,而对于其他script_name(应该反映它执行的功能)不太清楚。有一些原始操作系统需要这样的扩展来确定启动 Unix/Linux 的解释器,它们的 shell 很久以前就以更好的方式解决了这个问题。离开扩展程序会让你看起来缺乏经验。
  • 另外,套用 Charles Duffy 的话说,我们不使用 ls.elfemacs.bin 那么为什么您自己的命令应该有扩展名?
【解决方案4】:

它并没有真正适用于您的个人脚本,但是当您引用 beets 时,请注意,由于 setuptools entry_point 选项,您在分发包时也可以自动执行此操作。
因此,如果您正在分发像 myModule 这样的包并希望通过在控制台中键入 mymodulescript 来访问 main_function() 函数,您可能会在您的 setup.py 文件中添加类似这样的内容:

setup(
    # your other arguments ..
    entry_points={
        'console_scripts': [
            'mymodulescript = myModule:main_function'
        ]
    }
)

【讨论】:

    【解决方案5】:

    另一种解决方法是使用 .bashrc 中定义的别名:

    例如在 .bachrc 文件中添加以下行:

    alias mypythonalias="python mypyrhonfile.py"
    

    在终端输入:

    source ~/.bashrc
    

    然后你可以简单地输入:

    mypythonalias
    

    执行python文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 2018-12-10
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      相关资源
      最近更新 更多