加载没有模块的源文件

时间:2016-05-18 14:45:44

标签: python

我想传递一个文件并从中获取一个函数。

例如,我有一个文件foo.py,其位置在运行时才知道(它将通过命令行传递给代码或类似的东西),可以在我的系统上的任何位置看起来像这样:

def bar():
    return "foobar"

如何让我的代码运行函数bar

如果在运行时之前知道该位置,我可以这样做:

import sys
sys.path.append("path_to_foo")
import foo

foo.bar()

我可以在init.py所在的文件夹中创建foo.py文件并使用importlibimp,但这似乎很混乱。我得到__import__

时无法使用ImportError: Import by filename is not supported.

3 个答案:

答案 0 :(得分:6)

您可以打开文件并使用exec执行该文件。

f = open('foo.py')
source = f.read()
exec(source)
print bar()

您甚至可以使用re

查找特定功能

答案 1 :(得分:0)

您可以编写一个虚拟函数并在需要的任何地方调用它,以绕过检查:

def bar():
    pass

在运行时使用您实际想要的函数覆盖该函数,并自动在任何地方使用它。

注意:这比使用importlib更麻烦。

答案 2 :(得分:0)

如果foo.py与主文件位于同一目录中,则可以使用

from . import foo

(Python 3)。这是有效的,因为.是您文件的目录,Python将为您导入同一目录中的文件。然后你可以使用

foo.bar()

如果不是,则需要找到它,然后执行它:

import os
from os.path import join

lookfor = "foo.py"
for root, dirs, files in os.walk('C:\\'): # or '/' for Linux / OSX
    if lookfor in files:
        execfile(join(root, lookfor)) # Python 2, or
        with open(join(root, lookfor)) as file:
            exec(''.join(file.readlines()))
        break
foo.bar()

致谢:Martin Stone。我不只是复制代码,我理解代码,并且可以自己制作代码。