【问题标题】:I name a python file as "__main__.py", and I import __main__ in another file, can't run the functions in __main__我将一个python文件命名为“__main__.py”,并将__main__导入另一个文件,无法运行__main__中的函数
【发布时间】:2018-09-07 10:31:31
【问题描述】:

我创建了两个名为“test.py”和__main__.py的python文件。

在 test.py 中:

import __main__

__main__.py:

print(__name__)

但是当我运行 test.py 时,它什么也没输出。

然后,我将__main__.py 更改为:

def main():
    print("ok")

和 test.py:

import __main__
__main__.main()

运行 test.py 时出现错误:

Traceback (most recent call last):
   File "/Users/lyz/test.py", line 2, in <module>
    __main__.main()
AttributeError: module '__main__' has no attribute 'main'

谁能告诉我为什么?非常感谢!

【问题讨论】:

  • 阅读this可能会帮助你理解“为什么”
  • 我对将文件命名为 _main_ 的感觉非常糟糕,因为它确实是为其他目的而保留的。也许有人可以提示_main_的功能?
  • __main__ 是一个特殊名称,您应该只将它用于具有特殊功能的模块。 docs.python.org/3/library/__main__.html
  • 这就是为什么__main__.py 是一个不打算导入的顶级应用程序的好名字。对于不同目录中的模块,请使用__init__.py,您将能够通过命名目录来导入它。

标签: python python-3.x


【解决方案1】:

如下划线所示,__main__ 是一个神奇的模块名称。它指的是 Python 解释器首先执行的模块。如果你运行python test.py__main__就是test.py组成的模块。

请将您的 __main__.py 重命名为 main.py 并使用 import mainmain.main()

【讨论】:

    【解决方案2】:

    当您运行python test.py 时,解释器将“test.py”视为__main__ 模块而不是test 模块。这甚至在阅读“test.py”中的第一行之前就完成了。所以当你写import __main__时,它只是意味着import test

    您可以通过编写“__main__.py”来测试它,如下所示:

    def main():
        print("__main__ imported")
    

    将“test.py”写为:

    import __main__
    
    def main():
        print("test imported")
    
    __main__.main()
    

    现在运行python test.py,你会看到test imported

    【讨论】:

      【解决方案3】:

      您永远不会导入任何东西。因为你自己的文件被命名为__main__(这是真的,因为__name__返回'__main__'),不管你给你的文件起什么名字。

      除了正在运行的文件之外,您实际上从未导入任何内容:

      通过解释器运行它以了解我的意思。

      >>>def hello(): print('HELLO')
      ...
      >>>import __main__
      >>>__main__.hello()
      HELLO
      >>>
      >>>
      >>>__main__
      <module '__main__' (built-in)>
      

      您可以很清楚地看到__main__ 是一个内置命令,而__main__.py 永远不会被导入,只有原始脚本。

      从标准输入、脚本或交互式提示读取时,模块的 __name__ 设置为等于 '__main__'

      29.4. main — Top-level script environment

      为了解决问题,将 __main__.py 重命名为与内置命令不冲突的名称。

      【讨论】:

        【解决方案4】:

        要导入__main__.py,你需要把它放到一个文件夹中,然后Python会认为它是一个模块文件夹。

        .
        ├── my_module
        │   └── __main__.py
        └── test.py
        

        然后你应该把test.py放在这个文件夹之外,然后像这样导入__main__.py

        # test.py
        from my_module import __main__
        ...
        

        【讨论】:

          猜你喜欢
          • 2020-06-26
          • 1970-01-01
          • 2022-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 2020-10-16
          • 1970-01-01
          相关资源
          最近更新 更多