【问题标题】:referencing a main method in an imported module from a newbie to Python在从新手到 Python 的导入模块中引用 main 方法
【发布时间】:2014-08-18 11:36:53
【问题描述】:

如果问题背后的想法是错误的,我深表歉意:边走边学 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()

error:AttributeError: 'module' 对象没有属性 'gres'

【问题讨论】:

  • 您到底遇到了什么问题?这是 HADATA.main() 错字吗?您显示的代码是您实际使用的代码吗?
  • 是的:尽管在下面给出的答案之后它现在已更改为: HAData = GetOraData.main() HADataSet = GetOraData.gres 出现错误 AttributeError: 'module' object has no attribute 'gres'
  • 你只是在定义类的时候没有放 self 吧?
  • gres 是如何定义的?在您的示例中,GetInstances 真的需要成为一个类吗?

标签: python main


【解决方案1】:

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

GetOraData.main()
GetOraData.gres

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

【讨论】:

  • 这可能是一个非常愚蠢的问题,但我认为 OO 编程的整个想法是您声明一个类,然后获取该类的实例。所以这个文件叫做GetOraData,但是里面的类叫做TalktoOracle。我不会引用类,而不是文件名吗?
  • 要引用你必须以这种方式导入的类:from GetOraData import TalkToOracle
  • HAData = GetOraData.main() HADataSet = GetOraData.gres 给出 errAttributeError: 'module' object has no attribute 'gres' 这是在 GetOraData 模块类 TalkToOracle 的主类中定义的: cur =无 con = 无 gres = 无
  • gres 不是 TalkToOracle 类上的模块变量吗?要从模块访问它,它需要是模块级别的......模块是对象(如类),但只包含该文件的全局变量。
【解决方案2】:

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

检查其他模块中是否有打算用作模块的函数,以及可以调用的数据结构,可能是某些函数或对象。

【讨论】:

  • HAData = GetOraData.main() HADataSet = GetOraData.gres 给出 errAttributeError: 'module' object has no attribute 'gres' 这是在 GetOraData 模块类 TalkToOracle 的主类中定义的: cur =无 con = 无 gres = 无
【解决方案3】:

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

# 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 作为模块导入

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 2020-12-25
    • 1970-01-01
    • 2021-08-04
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多