exec语句python和导入模块

时间:2012-10-22 20:48:09

标签: python

我尝试使用exec语句导入模块但是失败了,

code.py

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

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

错误: 语法错误:

import:c:\ python27 \ test1.py

4 个答案:

答案 0 :(得分:4)

你可能意味着execfile(jobname)。导入不适用于文件名。它适用于包名称。任何好的教程都会涵盖这一点。另一个问题是\ t被解释为制表符,但在这里并非如此,因为你正在使用正斜杠而不是baclslash ......

答案 1 :(得分:1)

不知何故,我认为你必须要打电话

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

而不是

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

t前面的反斜杠被解释为制表符。因此错误

import:c:\python27 est1.py

注意缺少t

其次,import命令需要模块名称,而不是路径。要进行导入,请使用__import__而不是execexecfile。已从Python3中删除execfile,因此为了将来的兼容性,您可能不希望在Python2中使用它。可以使用exec代替,但有problems with using exec.

假设你的PYTHONPATH中有c:\python27,你可以 做这样的事情:

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

if __name__ == '__main__':
    test('test1')

答案 2 :(得分: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()变量中。

答案 3 :(得分:0)

  

我尝试使用exec语句

导入模块

不要那样做。

首先,您真的需要以编程方式导入模块吗?如果你告诉我们你真正想要完成什么,我愿意打赌我们可以找到方形页面的方孔,而不是教你如何将它强行放入圆孔。

如果您确实需要这样做,请使用the imp module;这就是它的用途。

特别是如果你想通过路径而不是按模块名称导入模块,这对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而不是全局变量{{1}},如果您已经重新加载而不会执行任何操作已加载它。但任何有充分理由做这类事情的人最好知道如何处理所有这些问题。