2017-08-25 7 views
0

これは、Pythonスクリプトtshi3.pyです:私はこのコードをコピーしてpython manage.py shellでそれを貼り付けパイプラインコマンドでdjangoシェルでインポートされた関数にアクセスできませんか?

import csv 
    def li2ho2(): 
     print(csv) 
    li2ho2() 

。 これは機能します。

しかし、私はpython manage.py shell < tshi3.pyを実行しました。 NameError: name 'csv' is not definedが見つかりました。

なぜですか?

的環境:

Linux Mint 18.1 
    Python 3.4.1 (default, Sep 3 2014, 08:45:22) 
    Django==1.11.4 

a similar questionがあります。

+0

お試しくださいcat | python manage.py shell'を実行し、インタプリタがロードされたら同じコードを貼り付けます。この配管がmanage.pyで動作するかどうかは本当に分かりません。 – geckos

+0

Djangoが入力をシェルプロセスに正しくリダイレ​​クトしていないと思われます。 – geckos

+0

'cat | python'も失敗しました。 – sih4sing5hog5

答えて

1

私はshellコマンドのコードを見てきました。ここでは、次のとおりです。

if sys.platform != 'win32' and select.select([sys.stdin], [], [], 0)[0]: 
    exec(sys.stdin.read()) 
    return 

問題は、EXECコマンドから来ているが、globalslocalsパラメータを渡さずに呼び出され、デフォルトで、現在のスコープのglobals()locals()辞書が使用されます。

モジュールレベルでは、グローバルとローカルは同じ辞書ですが、現在のスコープ(django.core.management.commands.shell.Command.handle)では、globals()とlocals()は2つの異なる辞書。そして、tshi3.pyのコードが実行されると、制御不能になります。

のは、コードの各行見ていきましょう:

import csv 

これは、モジュールcsvをインポートして、locals()辞書に入れます。したがって、locals() dictがglobals() dictと同じ場合は、これもglobals() dictになります。私たちの場合、csvlocals() dictでのみあり、globals() dictではありません。

次へ:コマンドprint(csv)が呼び出されると

def li2ho2(): 
    print(csv) 

csvは機能li2ho2locals()辞書で検索されます、そして、それはそこに確かではありませんので、csvglobals()辞書で調べています。しかし、私が上に書いたように、csvglobals()辞書にはないので、エラー:NameError: name 'csv' is not definedが発生します。

私は以下のようにtshi3.pyのコードを変更してみてください:

import csv 

print('globals() equals to locals(): {}'.format(globals() == locals())) 
print('csv is in globals(): {}'.format('csv' in globals())) 
print('csv is in locals(): {}'.format('csv' in locals())) 

def li2ho2(): 
    print('inside li2ho2 function:') 
    print(' csv is in globals(): {}'.format('csv' in globals())) 
    print(' csv is in locals(): {}'.format('csv' in locals())) 

li2ho2() 

そして、2つの異なる方法でそれを実行します。

$ python tshi3.py 
globals() equals to locals(): True 
csv is in globals(): True 
csv is in locals(): True 
inside li2ho2 function: 
    csv is in globals(): True 
    csv is in locals(): False 

$ ./manage.py shell < tshi3.py 
globals() equals to locals(): False 
csv is in globals(): False 
csv is in locals(): True 
inside li2ho2 function: 
    csv is in globals(): False 
    csv is in locals(): False 

だから、あなたはそれがまさに私が上記で説明したものとだ見ることができます。これはあなたを助け、私は短い問題を説明することはできないため、申し訳ありません

exec(sys.stdin.read(), {})

希望:この問題は、以下のようにexecコマンドのglobalsパラメータとして空の辞書を渡すことによって固定することができます。

関連する問題