在终端中运行脚本时未显示的打印语句

Emi*_*ily 2 python linux scripting

我是新手在终端中运行python脚本.我运行了脚本./filename.py并确保它是可执行的chmod + x filename.我还把#!/ usr/bin/env python放在程序的顶部.我没有错误,但我的终端中没有显示任何打印语句.附上是我的代码.有任何想法吗?

#!/usr/bin/env python

import ctypes
import os

def is_hidden(filepath):
    name = os.path.basename(os.path.abspath(filepath))
    return ('.' + name) or (has_hidden_attribute(filepath))

def has_hidden_attribute(filepath):
    try:
        attrs = ctypes.windll.kernel32.GetFileAttributesW(unicode(filepath))
        assert attrs != -1
        result = bool(attrs & 2)
    except (AttributeError, AssertionError):
        result = False
    return result

def main():
    print ('whatup')
    print(is_hidden('~/.jupyter'))
    print('hey')
Run Code Online (Sandbox Code Playgroud)

然后从终端

$ ./makepass_jup.py
$ 
Run Code Online (Sandbox Code Playgroud)

小智 6

你不是在main任何地方调用你的功能.在文件末尾添加:

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

if这里的语句是Python中的常见模式.当作为模块导入文件时,它可以防止执行代码.当Python解释器导入文件时,它会设置__name__变量.如果从另一个模块导入此文件,__name__则将设置为模块的名称.但是如果文件作为主程序执行,__name__变量将被设置为__main__,所以只有当文件作为程序执行时,才会执行该语句中的代码.

请参阅问题的接受答案如果__name__ =="__ main__"该怎么办?欲获得更多信息.

  • 我同意@martineau。虽然我自己对此感到内疚,但我们不应该鼓励 [cargo-cult 编程](https://en.wikipedia.org/wiki/Cargo_cult_programming)。 (2认同)

sbb*_*bbs 5

在 Python 中,main()函数不是入口点,这与 C 或 Java 等其他语言不同。就像其他人指出的那样,您main()没有在代码中的任何地方被调用。

您可以main()在模块的顶层调用您的函数,如下所示:

import ctypes
import os

(your functions)

main()
Run Code Online (Sandbox Code Playgroud)

但是,当您直接使用python命令运行此命令或从其他地方导入此模块时,将评估顶层的所有内容。假设您的脚本的文件名是,callee.py并且您正在编写另一个脚本caller.py,如下所示:

import callee
Run Code Online (Sandbox Code Playgroud)

然后callee.py将评估顶级的所有语句,包括main(). 如果这不是您的意图,您可以通过检查__name__变量的值来检查您的脚本是否直接从命令行调用。

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

如果你的脚本是直接从命令行调用的值__name____main__。否则它将是模块的名称。在这种情况下,callee


Mur*_*nik 1

这个脚本只是定义了一堆函数。您需要实际调用main()才能执行它。