【问题标题】:Print statements not showing up when running script in terminal在终端中运行脚本时不显示打印语句
【发布时间】:2017-06-13 13:13:04
【问题描述】:

我是在终端中运行 python 脚本的新手。我已经运行了脚本 ./filename.py 并确保它可以使用 chmod +x 文件名执行。我还将#!/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')

然后从终端

$ ./makepass_jup.py
$ 

【问题讨论】:

  • 您的背景是Java 还是C? Python 中的 main 函数没有什么特别之处。您必须实际调用它。

标签: python linux scripting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你没有在任何地方调用你的main 函数。在文件末尾添加:

    if __name__ == '__main__':
        main()
    

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

    有关更多信息,请参阅问题What does if __name__ == “__main__”: do? 的已接受答案。

    【讨论】:

    • 请解释这段代码的作用/它是如何工作的。为什么不在最后添加main() 电话?
    • Python 解释器执行文件中的所有代码。因此,如果您曾经导入此文件,如果您不使用该 if 语句,代码将始终被执行。但是如果从命令行运行它,包含模块名称的__name__变量将是'main'并且代码将被执行。基本上,这个想法是防止执行您不想在将文件作为模块导入时执行的代码。更多详情请参考这个问题:stackoverflow.com/questions/419163/what-does-if-name-main-do
    • 我建议你 edit 你的答案并添加解释 - 那么它可能值得投票,IMO。
    • 我同意@martineau。虽然我自己对此感到内疚,但我们不应该鼓励cargo-cult programming
    • 编辑了我的答案。感谢@martineau 的建议。
    【解决方案3】:

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

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

    import ctypes
    import os
    
    (your functions)
    
    main()
    

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

    import callee
    

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

    if __name__ == '__main__':
        main()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2018-08-19
      • 2018-09-07
      相关资源
      最近更新 更多