【问题标题】:How to make an executable to use in a shell - Python如何使可执行文件在 shell 中使用 - Python
【发布时间】:2011-11-10 00:18:05
【问题描述】:

我有一个 Python 脚本,我想知道如何使它可执行;换句话说,我如何使用 bash 之类的 shell 来运行它。

我知道第一件事是坚持第一行#! /usr/bin/env python,但是我是否需要例如功能按特定顺序排列(即,顶部或底部的主要功能)。我还需要为我的 python 文件保留扩展名 .py (我可以只调用函数Dosomething 吗?)。

简而言之,您能否提供一个简单的指南,说明人们在使 Python 文件可执行时必须考虑的要点?

【问题讨论】:

    标签: python shell executable


    【解决方案1】:

    删除第一个空格。也就是说,

    #!/usr/bin/env python
    

    应该是文件的第一行。然后,确保将文件的权限设置为可执行:

    chmod u+x your_script.py
    

    Python 脚本按顺序执行。如果您有一个包含函数的文件,通常的做法是在文件的最后添加如下所示的内容:

    if __name__ == '__main__':
        main()
    

    main() 开始执行脚本的地方。我们这样做的原因,而不是对 main() 的简单调用,是因为这允许您使您的脚本像一个模块一样运行,而无需任何修改;如果您只有一行调用 main(),您的模块将执行脚本的 main。 if 语句只是检查您的脚本是否在 __main__ 命名空间中运行,即它是否作为脚本运行。

    【讨论】:

      【解决方案2】:

      这就是我制作可执行脚本的方式。它不考虑eggs 或类似的东西。这只是一个我希望能够执行的简单脚本。我假设您使用的是 linux。

      #! /usr/bin/env python
      import sys
      
      
      def main():
          #
          # Do something ... Whatever processing you need to do, make it happen here.
          # Don't shove everything into main, break it up into testable functions!
          #
          # Whatever this function returns, is what the exit code of the interpreter,
          # i.e. your script, will be.  Because main is called by sys.exit(), it will
          # behave differently depending on what you return.
          # 
          # So, if you return None, 0 is returned.  If you return integer, that 
          # return code is used.  Anything else is printed to the console and 1 (error) 
          # is returned.
          #
          if an_error_occurred:
              return 'I\'m returning a string, it will be printed and 1 returned'
      
          # Otherwise 0, success is returned.
          return 0
      
      # This is true if the script is run by the interpreter, not imported by another
      # module.
      if __name__ == '__main__':
          # main should return 0 for success, something else (usually 1) for error.
          sys.exit(main())
      

      现在,如果你的权限设置正确,你就可以执行这个脚本了。

      需要意识到的是,当您的脚本被处理时,每一行都在解释器中执行。这是真的,不管处理器如何“得到它”。那就是将脚本作为模块导入并作为脚本执行,它们的工作原理基本相同,因为它们都执行模块的每一行。

      一旦您意识到您的脚本只是在运行时执行,您就会意识到函数的顺序并不重要。函数声明是函数声明。当您调用函数时才是最重要的。

      所以,一般来说,你的脚本布局是这样的

      def func1():
          pass
      def func2():
          pass
      def main():
          return 0
      
      if __name__ == '__main__':
          sys.exit(main())
      

      您首先创建要使用的功能,然后再使用它们。希望对您有所帮助。

      【讨论】:

      • 该死的地狱!我正是这个意思!非常感谢jaime,很棒的东西,很好的解释!它确实是这样工作的!干杯伙伴!
      【解决方案3】:

      唯一的事情(就像你说的那样)是包括:

      #! /bin/env python
      

      在第一行。甚至不是强制性的,而是推荐的。 之后,你可以称之为写作:

      python [filename].py
      

      在终端或 bash 文件中。

      【讨论】:

        【解决方案4】:

        您还必须授予它执行权:

        chmod u+x yourfile.py
        

        【讨论】:

          【解决方案5】:

          您的代码应遵循模板

          # any functions I want to define, and will be accessible when imported as module  
          # or run from command line
          ...
          
          if __name__ == '__main__':
              # things I want to do only when I run it from the command line
              ...  
          

          如果您希望能够在不使用 python fileName.py 而只使用 ./fileName.py 的情况下运行它,那么您需要制作文件的第一行

          #!/usr/bin/env python
          

          并使文件至少可以被用户执行

          chmod u+x fileName.py
          

          如果您没有在文件中添加 .py 扩展名,那么它仍然可以从命令行运行...但不能被其他模块导入。

          【讨论】:

          • @eddieantonio 所以我的文件当然是可执行的,第一行是 '#!/usr/bin/env python' 但什么也没发生(它在 shell python 中工作)。使用 if name == 'main': def main() 给我一个错误(基本上我必须定义 main)。我必须用顶部的 main 函数来组织脚本吗?
          【解决方案6】:
          1. #!/usr/bin/python放在第一行
          2. 您可以为您的 Python 脚本命名任何名称,例如:myPythonScript(不,您不需要保留 .py 扩展名)
          3. chmod +x myPythonScript
          4. 运行它:./myPythonScript

          示例:myPythonScript

          #!/usr/bin/python
          print "hello, world!"
          

          【讨论】:

            【解决方案7】:

            您需要按照您的描述添加 sha bang,例如

            #!/usr/bin/python
            

            #!/usr/bin/env python
            

            作为文件的第一行,您需要通过运行使其可执行

            chmod +x Dosomething
            

            您不需要做任何其他事情,特别是文件名可以是包括Dosomething 在内的任何内容。您的 PATH 可能不包含文件所在的目录,因此您应该像这样运行它(假设您当前的工作目录是文件所在的位置):

            ./Dosomething
            

            【讨论】:

            • 在 python 未安装在/usr/bin 而是在其他目录中的情况下,使用#! /usr/bin/env python 更灵活。
            猜你喜欢
            • 1970-01-01
            • 2013-10-10
            • 2018-11-22
            • 1970-01-01
            • 1970-01-01
            • 2021-05-12
            • 2012-02-15
            • 2020-09-13
            • 2020-11-18
            相关资源
            最近更新 更多