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



如果问题背后的想法是错误的,我道歉:只是在我走的时候拿起Python。所以我写了一个python模块,去到一个数据库,并得到一堆标准数据,是由许多其他模块使用,所以我认为这将是一个很好的做法,以建立一个可重用的模块。这里有一个类:

class TalkToOracle:
带有属性 的

gres = None

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

def 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'

您需要显式调用GetOraData的main模块属性:

GetOraData.main()
GetOraData.gres

当你导入一个模块时,它的所有属性都在它的命名空间中。

  • https://docs.python.org/2.7/tutorial/classes.html a-word-about-names-and-objects
  • http://pyvideo.org/video/1749/namespaces-in-python
  • 名称空间http://pyvideo.org/search?models=videos.video&
  • ; q =

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

检查其他模块中是否有作为模块使用的函数,具有可以调用的数据结构,可能是一些函数或对象。

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

# 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 GetInstances.py)。如果你把这类东西放到另一个文件(getoradata。py)中它不会被执行因为在这里这个文件只是作为模块被getinstances。py

导入

相关内容

  • 没有找到相关文章

最新更新