1

いくつかの python ビルド スクリプトのスクリプトを再利用しようとしています。私の「再利用可能な」部分の省略版は (_build.py) のようになります:

Sources = []
Sources += glob('*.c')
Sources += glob('../FreeRTOS/*.c')
...
def addSources(directory, *rest):
  for each in rest:
    Sources += ['../'+directory+'/'+each+'.c']

def addSharedSources(*args):
  addSources('Shared', *args)

次に、カスタマイズされた部分に、(build.py) のようなものがあります。

#!/usr/bin/env python
from _build import *
...
#Additional source files from ../Shared, FreeRTOS and *.c are already in
addSharedSources('ccpwrite', 'discovery', 'radioToo', 'telemetry', 'utility')

残念ながら、build.py を実行しようとすると、次のようなトレースバックが表示されます。

Traceback (most recent call last):
File "./build.py", line 8, in <module>
 addSharedSources('ccpwrite', 'discovery', 'radioToo', 'telemetry', 'utility')
File "/Users/travisg/Projects/treetoo/Twig/_build.py", line 49, in addSharedSources
 addSources('Shared', *args)
File "/Users/travisg/Projects/treetoo/Twig/_build.py", line 46, in addSources
 Sources += ['../'+directory+'/'+each+'.c']
UnboundLocalError: local variable 'Sources' referenced before assignment

そのため、ワイルドカード インポートを行ったにもかかわらず、インポート関数が呼び出されたときに、元からインポートされた「グローバル」変数を参照していないように見えます。それを機能させる方法はありますか?をいじってみましglobalたが、それは私が望んでいたことではなかったようです。

4

1 に答える 1

2

これはインポートとは何の関係もありません。直接実行した場合も同じ問題が発生します_build.py。問題は、関数がグローバルを宣言せずaddSourcesにグローバルを変更していることです。関数に宣言をSources挿入すると、すべてうまくいくはずです。globaladdSources

説明:この種のコードを誤って書くのは非常に簡単です。したがって、Pythonでは、グローバル変数をグローバルとして宣言せずに読み取ることができますが、変更することはできません。

于 2013-01-26T01:31:18.760 に答える