Python全局变量混乱

时间:2013-06-15 04:40:05

标签: python variables global

我有一些VB代码,我试图在Python中复制,但我是Python的新手,它对全局变量的处理让我完全糊涂了。

我有一个Python脚本(pytSettings),它从文本文件中导入文本,并将部分文本分配给各种字符串变量。实施例...

def main(): 
    strFileS = "/Users/username/Desktop/settings.txt"
    fileHandleS = open(strFileS, 'r')
    fileContentsS = fileHandleS.readlines()
    fileHandleS.close()

    strPhotoInclude = fileContentsS[0]

然后,我有第二个脚本(pytBatch)循环通过单独的文本文件的行,并将每行文本的部分分配给一组不同的字符串变量。在第二个脚本(pytBatch)中,我需要访问第一个脚本(pytSettings)中的变量。

使问题复杂化,在第二个脚本(pytBatch)的While循环中,我调用第三个脚本(pytGenerate),它需要访问第一个和第二个脚本中的字符串变量。

def main():    
    strFileB = "/Users/username/Desktop/batch.txt"
    fileHandleB = open(strFileB, 'r')
    fileContentsB = fileHandleB.readlines()
    fileNumLines = len([l for l in fileContentsB if l.strip(' \n') != ''])
    fileHandleB.close

    icnt = 0
    while icnt < (fileNumLines):
        fileHandleB = open(strFileB, 'r')
        fileLine = fileHandleB.readlines()
        strLineTemp = fileLine[icnt]
        strLineTempI = strLineTemp.find("|")
        strPhotoLocation = strLineTemp[0:strLineTempI]
        if strPhotoLocation == "NullField":
            strPhotoInclude = "FALSE"
        else:
            strPhotoInclude = strPhotoInclude

        pytGenerate.main()

        icnt = icnt +1

在上面的示例中:

  1. strPhotoInclude在pytSettings脚本中设置。
  2. strPhotoLocation在pytBatch脚本中设置
  3. 如果strPhotoLocation =“NullField”,则strPhotoInclude设置为“FALSE”
  4. 调用strGenerate,在该代码中使用strPhotoInclude和strPhotoLocation(未显示,因为在我成功学习如何从pytSettings到pytBatch获取变量之前,脚本pytGenerate是无用的)
  5. pytBatch然后恢复并循环通过下一个icnt迭代
  6. 我已经读过全局变量上的几十个主题,并尝试将全局声明放在任意数量的地方,但我无法正确排序。

    提前感谢您提供任何帮助。

    编辑到ADD:

    行。这让我超过了第一个障碍,但是对第三个文件的调用引起了相关问题。

    在第二个文件中,有一个循环设置了几个全局变量,运行第三个脚本,然后在第二个脚本中循环另一个迭代以重置变量,然后重新运行第三个脚本。

    import pytSettings
    pytSettings_main()
    
    def main():
        '''code that loads the text file omitted'''
        global strPhoto
        icnt = 0
        while icnt < (fileNumLines):
            strPhoto = strLineTemp
            '''reset photo include to false if photo if no photo filename provided'''
            if strPhoto == "NullField":
                pytSettings.strPhotoInclude = "FALSE"
            else:
                pytSettings.strPhotoInclude = "TRUE"
    
        '''call the Generate script'''
        pytGenerate.main()
    
        '''iterate to next line of the input text file'''
        icnt = icnt +1
    

    我的第三个脚本(pytGenerate)无法从第二个脚本(pytBatch)中找到全局变量,但可以从第一个脚本(pytSettings)中找到它们。

    import pytSettings
    import pytBatch
    
    def main():
        print pytSettings.strMarginTop '''this works'''
        print pytBatch.strPhoto        '''this does not'''
    

    尝试引用第二个脚本的全局变量(strPhoto)会导致“'module'没有属性'strPhoto'”。

1 个答案:

答案 0 :(得分:1)

在函数中,您需要将变量声明为全局变量:

>>> def some_function():
>>>     global x
>>>     x = 5
>>> x # before executing f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

>>> f()
>>> x # after executing f()
5

对于多个文件,它基本上是相同的,除了变量也被文件命名为:

<强>文件1:

## py1.py
def main():
    global x
    x = 10

<强> file2的:

## py2.py
import py1
py1.main()
print py1.x