web-dev-qa-db-ja.com

python:sysは定義されていません

Linuxで動作するコードがあり、Windowsで実行しようとしています。sysをインポートしますが、sys.exit()を使用する場合は。エラーが発生しました、sysが定義されていません。これが私のコードの最初の部分です

try:
    import numpy as np
    import pyfits as pf
    import scipy.ndimage as nd
    import pylab as pl
    import os
    import heapq
    import sys
    from scipy.optimize import leastsq

except ImportError:
    print "Error: missing one of the libraries (numpy, pyfits, scipy, matplotlib)"
    sys.exit()

Sysが機能しないのはなぜですか?

30
astrochris

移動import sys外部try-exceptブロックの:

import sys
try:
    # ...
except ImportError:
    # ...

インポートのいずれかbefore the import sys行は失敗し、ブロックのrestは実行されず、sysはインポートされません。代わりに、実行は例外処理ブロックにジャンプし、そこで存在しない名前にアクセスしようとします。

sysはとにかく組み込みモジュールです。インポートを追跡するためのデータ構造を保持しているため、alwaysが存在します。 sysのインポートに失敗した場合、手に大きな問題があります(それはallモジュールのインポートが壊れていることを示します)。

55
Martijn Pieters

これらすべてのモジュールを一度にインポートしようとしています。それらの1つが失敗しても、残りはインポートされません。例えば:

try:
    import datetime
    import foo
    import sys
except ImportError:
    pass

fooが存在しないとしましょう。その後、datetimeのみがインポートされます。

できることは、ファイルの先頭、try/exceptステートメントの前にsysモジュールをインポートすることです。

import sys
try:
    import numpy as np
    import pyfits as pf
    import scipy.ndimage as nd
    import pylab as pl
    import os
    import heapq
    from scipy.optimize import leastsq

except ImportError:
    print "Error: missing one of the libraries (numpy, pyfits, scipy, matplotlib)"
    sys.exit()
4
TerryA

Sysをインポートする前にコードが失敗したため、例外を処理するときにそれを見つけることができません。

また、tryブロック内でコードをインデントする必要があります。

試してください:

import sys
# .. other safe imports
try:
    import numpy as np
    # other unsafe imports
except ImportError:
    print "Error: missing one of the libraries (numpy, pyfits, scipy, matplotlib)"
    sys.exit()
1
astrognocci