具有自动相对路径的execfile

时间:2014-02-27 16:02:54

标签: python python-2.7 ironpython execfile

我需要能够通过execfile()从工作目录外部调用python脚本,而不必每次通过解释器指定相对文件路径。

而不是:

execfile("..\\UserScripts\\HelloWorld.py")

我需要打电话:

execfile("HelloWorld.py")

是否有一个sys.path我可以将其添加到这使得这个工作?目录是固定的,工作目录和文件的位置也是固定的。期望用户可以将文件放入UserScripts目录,并希望能够通过解释器调用它而不需要相对文件路径。

2 个答案:

答案 0 :(得分:0)

我强烈建议您使用其他名称(例如execscript),您可以将其添加到执行用户脚本的范围中:

scope.SetVariable("execscript", (CodeContext context, string filename) => {
    Builtins.execfile(context, Patch.Combine("../../Scripts", filename));
});

这将使它看起来像一个内置素,而不会使用内置词典。

如果必须是execfile,那么最好的办法是将execfile内置版替换为修补目录的内置版,然后调用旧的execfile。这是一些完全未经测试的未编译代码,应该指向正确的方向:

var engine = Python.CreateEngine();
var builtins = engine.GetBuiltinModule();
builtins.SetVariable("execfile", (CodeContext context, string filename) => {
    Builtins.execfile(context, Patch.Combine("../../Scripts", filename));
});

答案 1 :(得分:0)

以下脚本假定HelloWorld.py与您的可执行文件位于同一目录中。

import os.path
import sys

execfile(os.path.join( os.path.dirname(sys.argv[0]), 'HelloWorld.py'))

但是,如果你有一个你保留片段的子目录(让我们称之为' ../ UserSnippets')你可以指定相对于包含execfile的脚本的路径:

execfile(os.path.join( os.path.dirname(sys.argv[0]), '..','UserSnippets','HelloWorld.py'))

使用os.path.join可以保持代码的可移植性(我希望,我只在我的Mac上测试过)。