在从新手到Python的导入模块中引用main方法

2024-06-16 12:08:44 发布

您现在位置:Python中文网/ 问答频道 /正文

如果问题背后的想法是错误的,我道歉:我只是拿起Python。 因此,我编写了一个python模块,该模块将转到一个数据库,并获取大量其他模块使用的标准数据,因此我认为将其构建为一个可重用的模块是一个很好的实践。 所以有一个类:

class TalkToOracle:

具有属性

gres = None

一堆其他函数,最后还有一个主函数

def main():

有一行我不完全理解,但似乎在引用类时自动运行main方法(?)你知道吗

if __name__ == "__main__":
    main()

Main按顺序运行类中的函数,并将结果粘贴到属性gres中

一切都很好,独自一人。文件另存为获取数据.py 我现在想重用这个代码,所以。。。。。。。 在另一个Python模块中

import GetOraData


class GetInstances:
    def oraInstanceData(self):
        log.info('Getting instance routing data')
        HAData = GetOraData.TalkToOracle()
        log.info('debug1')

从这里开始一切都是梨形的。 我只想运行另一个模块,并访问属性gres中的结果。 我试过这个(以及我能想到的所有其他变化),但没有乐趣。 我觉得我错过了一些基本的东西。你知道吗

HADATA.main()
log.info('debug2')
HADataSet = HAData.gres
log.info('debug3')
log.info('Query fetched ' + str(len(HADataSet)) + ' rows')

任何帮助都将不胜感激。你知道吗

经过一些工作之后,下面是仍然抛出错误的修改后的代码

import logging
import time
import uuid
import GetOraData
from datetime import datetime

log = logging.getLogger()
log.setLevel('INFO')

class GetInstances:
    def oraInstanceData(self):
        log.info('Getting HA instance routing data')
        HAData = GetOraData.main()
        HADataSet = GetOraData.gres
        log.info('Query fetched ' + str(len(HADataSet)) + ' HA Instances to query')

def main():

    logging.basicConfig()
    start = time.time()

    #oracle routines

    oraInstances = GetInstances()
    oraInstances.oraInstanceData()


if __name__ == "__main__":
    main()

你知道吗错误:AttributeError:“module”对象没有属性“gres”


Tags: 模块函数importinfolog属性maindef
3条回答

您需要明确地调用GetOraData的main模块属性:

GetOraData.main()
GetOraData.gres

导入模块时,其所有属性都位于命名空间中。你知道吗

如果代码如下所示:

# GetOraData.py

class TalkToOracle:

    def __init__(self):
        self.gres = None

    def main(self):
        self.gres = 'Foo'

那么你就可以这样做:

# GetInstances.py
from GetOraData import TalkToOracle

class GetInstances:

    def oraInstanceData(self):

       HAData = TalkToOracle()
       print HAData.gres
       # None

       HAData.main()
       print HAData.gres
       # Foo

if __name__ == "__main__":

    # test it
    x = GetInstances()
    x.oraInstanceData()

# $ python GetInstances.py
# None
# Foo

所以您可以访问“gres”属性并检查值。你知道吗

if __name__ == '__main__' 

当您从命令行(即python)调用您的程序时,是否要执行获取实例.py). 如果你把这种东西放到另一个文件里(获取数据.py)它将不会被执行,因为在这种情况下,此文件只是作为模块由导入获取实例.py你知道吗

__name__是当前模块的名称。当程序作为应用程序(而不是导入的模块)运行时,该名称是"__main__"。这就是它下面的代码运行的原因。该测试下的代码不打算用作模块。这段代码很可能使用系统argv(命令行参数),但设置不正确。你知道吗

检查另一个模块中是否有要用作模块的函数,以及可以调用的数据结构,可能是某个函数或对象。你知道吗

相关问题 更多 >