2

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

代码.py

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

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

错误:语法错误:

导入:c:\python27 est1.py

4

4 回答 4

4

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

于 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__notexecexecfile. execfile已从 Python3 中删除,因此为了将来的兼容性,您可能不想在 Python2 中使用它。exec可以改用,但是使用有问题exec

假设c:\python27在您的 PYTHONPATH 中,您可以执行以下操作:

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

if __name__ == '__main__':
    test('test1')
于 2012-10-22T20:49:49.453 回答
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'],并且在局部变量job而不是全局变量test1中,并且如果您已经加载它,它将重新加载而不是什么都不做。但是任何有充分理由做这种事情的人最好知道如何处理所有这些问题。

于 2012-10-22T23:04:01.443 回答
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 回答