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]

次に、別のテキスト ファイルの行をループ処理し、テキストの各行の一部を異なる文字列変数のセットに割り当てる 2 つ目のスクリプト (pytBatch) を作成します。この 2 番目のスクリプト (pytBatch) 内で、最初のスクリプト (pytSettings) の変数にアクセスする必要があります。

複雑なことに、2 番目のスクリプト (pytBatch) の While ループ内で、1 番目と 2 番目のスクリプトの文字列変数にアクセスする必要がある 3 番目のスクリプト (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 反復をループします。

グローバル変数で数十のスレッドを読み、グローバル宣言を任意の数の場所に配置しようとしましたが、シーケンスを正しく取得できません。

ご協力いただきありがとうございます。

編集して追加:

わかった。これで最初のハードルを乗り越えることができましたが、3 番目のファイルへの呼び出しが関連する問題を引き起こしています。

2 番目のファイルには、いくつかのグローバル変数を設定し、3 番目のスクリプトを実行してから、2 番目のスクリプトの別の反復をループして変数をリセットし、3 番目のスクリプトを再実行するループがあります。

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

私の 3 番目のスクリプト (pytGenerate) は、2 番目のスクリプト (pytBatch) からグローバルを見つけることができませんが、最初のスクリプト (pytSettings) からは見つけることができます。

import pytSettings
import pytBatch

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

2 番目のスクリプトのグローバル変数 (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 に答える