我将python文件命名为“__main__.py”,并在另一个文件中导入__main__,无法运行__main__中的函数

时间:2018-03-28 16:20:31

标签: python python-3.x

我创建了两个名为“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'
谁能告诉我为什么?非常感谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

你永远不会进口任何东西。由于您自己的文件名为__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重命名为与内置命令不冲突的内容。

答案 2 :(得分:0)

要导入 Sub SelectFields() Dim a As String Dim pt As PivotTable ThisWorkbook.Worksheets("Sheet1").Activate a = Worksheets("Selection").Cells(3, 1).Value For Each pt In ActiveSheet.PivotTables With pt.PivotFields("CODE") .ClearAllFilters .CurrentPage = a End With Next End Sub ,您需要将其放入一个文件夹中,然后 Python 会将其视为模块文件夹。

    Sub CopyPivotBody()

Dim ws As Worksheet
Dim pt As PivotTable
Dim rngBody As Range

    Set ws = Sheets("sheet1")
    Set pt = ws.PivotTables(1)
    Set rngBody = pt.TableRange1
    
    
    rngBody.Copy Sheets("Selection").Range("A" & Rows.Count).End(xlUp).Offset(1)
    
End Sub

然后你应该把 __main__.py 放在这个文件夹之外并像这样导入 . ├── my_module │   └── __main__.py └── test.py

test.py