在Eclipse PyDev中Python脚本执行两次

1 投票
1 回答
813 浏览
提问于 2025-04-18 04:03

我在Eclipse的PyDev里有一个叫做automated_vertica的项目,结构如下:

automated_vertica
    src
        root
            __init__.py
            RequestHandler.py

RequestHandler.py是一个模块,里面有很多方法,其他的什么都没有。

__init__.py里面只有两行代码:

from root import RequestHandler
print('test')

当我在PyDev里运行__init__.py时,Eclipse的控制台显示test两次。如果我把from root去掉,它就能正常工作。

你能帮我解释一下我漏掉了什么,以及这里发生了什么吗?

编辑:RequestHandler.py的内容是:

'''
Created on Apr 23, 2014

@author: myname
'''
def FileToString(fileName): 
    f = open(fileName, 'r')
    result = f.read() 
    f.close()
    return result

def Flatten(listOfLists):
        return [value for sublist in listOfLists for value in sublist]

1 个回答

3

因为 root 里有一个 __init__ 文件,所以它被称为一个模块。

当你运行 from module import.. 的时候,它会执行这个模块里 __init__ 文件中的所有代码。

而你的 __init__ 文件里有一个 print,所以这个打印语句会被执行。

由于你直接运行 __init__(其实这样做是不太好的),它会执行以下内容:

-> from root import RequestHandler
    -> root.__init__:
        -> import RequestHandler
        -> print("Test")
-> print("Test")

__init__ 文件可以用来检查某些模块是否存在,或者作为备用方案,或者检查 Python 的版本。

比如,这个 __init__.py 文件会阻止任何版本低于 400 的 Python 导入这个模块:

import sys

if not hasattr(sys, "version_info") or sys.version_info < (400, 0):
    raise RuntimeError("root requires Python 400.0 or later.")

del sys

from root import RequestHandler
print("Test")

希望它能一直更新到永远。

撰写回答