0

我有一些我试图在 Python 中复制的 VB 代码,但我是 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 迭代

我已经阅读了几十个关于全局变量的线程,并尝试将全局声明放在任意数量的地方,但我就是无法正确排序。

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

编辑添加:

好的。这让我克服了第一个障碍,但是对第三个文件的调用导致了一个相关的问题。

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

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'”。

4

1 回答 1

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

文件2:

## py2.py
import py1
py1.main()
print py1.x
于 2013-06-15T05:20:59.623 回答