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

时间:2014-08-18 11:36:54

标签: python main

如果问题背后的想法是错误的,那就道歉:只要我去就拿起Python。 所以我编写了一个python模块,该模块进入数据库并获取许多其他模块使用的标准数据,所以我认为将它构建为可重用模块是一种好习惯。 所以有一个班级:

class TalkToOracle:

带有属性

gres = None

一堆其他功能,以及最后的主要功能

def main():

有一条线我不完全理解但似乎在引用类时会自动运行main方法(?)

if __name__ == "__main__":
    main()

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

所有人都独自站立。该文件将另存为GetOraData.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'

3 个答案:

答案 0 :(得分:0)

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

GetOraData.main()
GetOraData.gres

导入模块时,其所有属性都在命名空间中。

答案 1 :(得分:0)

__name__是当前模块的名称。当程序作为应用程序(而不是导入的模块)运行时,该名称为"__main__"。这就是导致其下的代码运行的原因。该测试下的代码并不打算用作模块。这段代码很可能使用sys.argv(命令行参数),这些参数没有正确设置。

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

答案 2 :(得分:0)

如果你的代码看起来像这样:

# 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__' 
当您从命令行调用程序时(。如果你把这种东西放在另一个文件(GetOraData.py)中就不会被执行,因为在这种情况下这个文件只是被GetInstances.py作为模块导入