execステートメントを使用してモジュールをインポートしようとしていますが、失敗します。
code.py
def test(jobname):
print jobname
exec ('import ' + jobname)
if __name__ = '__main__':
test('c:/python27/test1.py')
エラー:構文エラー:
import:c:\ python27 est1.py
execステートメントを使用してモジュールをインポートしようとしていますが、失敗します。
code.py
def test(jobname):
print jobname
exec ('import ' + jobname)
if __name__ = '__main__':
test('c:/python27/test1.py')
エラー:構文エラー:
import:c:\ python27 est1.py
あなたはおそらく意味しexecfile(jobname)
ます。また、インポートはファイル名では機能しません。パッケージ名で動作します。優れたチュートリアルはそれをカバーします。別の問題は \t がタブ文字として解釈されることですが、バックスラッシュではなくスラッシュを使用しているため、ここではそうではありません...
どういうわけか、私はあなたが電話しているに違いないと思います
test('c:\python27\test1.py')
それ以外の
test('c:/python27/test1.py')
の前のバックスラッシュはt
、タブ文字として解釈されています。したがって、エラー
import:c:\python27 est1.py
がないことに注意してt
ください。
次に、import
コマンドはパスではなくモジュール名を想定しています。インポートには、__import__
notexec
またはを使用しますexecfile
。execfile
は Python3 から削除されたので、将来の互換性のために、Python2 では使用したくないかもしれません。exec
代わりに使用できますが、使用には問題がありますexec
。
が PYTHONPATH にあると仮定するc:\python27
と、次のようなことができます。
def test(jobname):
print jobname
__import__(jobname)
if __name__ == '__main__':
test('test1')
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() 変数に追加する必要があります。
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']
にローカル変数にあり、すでにロードされている場合は何もしない代わりにリロードされます。しかし、この種のことを行う正当な理由がある人は、これらすべての問題に対処する方法を知っている必要があります.job
test1