2

execステートメントを使用してモジュールをインポートしようとしていますが、失敗します。

code.py

def test(jobname):
    print jobname
    exec ('import ' + jobname)

if __name__ = '__main__':
  test('c:/python27/test1.py')

エラー:構文エラー:

import:c:\ python27 est1.py

4

4 に答える 4

4

あなたはおそらく意味しexecfile(jobname)ます。また、インポートはファイル名では機能しません。パッケージ名で動作します。優れたチュートリアルはそれをカバーします。別の問題は \t がタブ文字として解釈されることですが、バックスラッシュではなくスラッシュを使用しているため、ここではそうではありません...

于 2012-10-22T20:57:32.240 に答える
1

どういうわけか、私はあなたが電話しているに違いないと思います

test('c:\python27\test1.py')

それ以外の

test('c:/python27/test1.py')

の前のバックスラッシュはt、タブ文字として解釈されています。したがって、エラー

import:c:\python27 est1.py

がないことに注意してtください。

次に、importコマンドはパスではなくモジュール名を想定しています。インポートには、__import__notexecまたはを使用しますexecfileexecfileは Python3 から削除されたので、将来の互換性のために、Python2 では使用したくないかもしれません。exec代わりに使用できますが、使用には問題がありますexec

が PYTHONPATH にあると仮定するc:\python27と、次のようなことができます。

def test(jobname):
    print jobname
    __import__(jobname)

if __name__ == '__main__':
    test('test1')
于 2012-10-22T20:49:49.453 に答える
0
def test(jobname):
    print jobname
    a = jobname.split('/')
    b = "/".join(a[0:-1])
    c = a[-1][0:-3]
    sys.path.append(b)
    exec ('import ' + c)

if __name__ = '__main__':
  test('c:/python27/test1.py')

このコードを試してください。パスを sys.path() 変数に追加する必要があります。

于 2012-10-22T20:59:52.617 に答える
0

exec ステートメントを使用してモジュールをインポートしようとしています

そうしないでください。

まず、モジュールをプログラムでインポートする必要は本当にあるのでしょうか? あなたが実際に達成しようとしていることを教えていただければ、丸い穴に押し込む方法を教える代わりに、あなたの正方形のページの正方形の穴を見つけることができると確信しています.

これを行う必要がある場合はimpモジュールを使用してください。それがそのためです。

特に、モジュール名ではなくパスでモジュールをインポートしたい場合、これはimportステートメントでは実行できません (そして、それexecは役に立ちません)。

次に例を示します。

import imp

def test(jobname):
    print jobname
    while open(jobname, 'r') as f:
        job = imp.load_module('test', f, jobname, ('.py', 'U', 1))

もちろん、これはimport test1あなたの にあった場合と同じことはしませんsys.path。モジュールは のsys.modules['test']代わりににあり、グローバル変数の代わりsys.modules['test1']にローカル変数にあり、すでにロードされている場合は何もしない代わりにリロードされます。しかし、この種のことを行う正当な理由がある人は、これらすべての問題に対処する方法を知っている必要があります.jobtest1

于 2012-10-22T23:04:01.443 に答える