我想传递一个文件并从中获取一个函数。
例如,我有一个文件foo.py
,其位置在运行时才知道(它将通过命令行传递给代码或类似的东西),可以在我的系统上的任何位置看起来像这样:
def bar():
return "foobar"
如何让我的代码运行函数bar
?
如果在运行时之前知道该位置,我可以这样做:
import sys
sys.path.append("path_to_foo")
import foo
foo.bar()
我可以在init.py
所在的文件夹中创建foo.py
文件并使用importlib
或imp
,但这似乎很混乱。我得到__import__
ImportError: Import by filename is not supported.
答案 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。我不只是复制代码,我理解代码,并且可以自己制作代码。