我需要能够通过execfile()从工作目录外部调用python脚本,而不必每次通过解释器指定相对文件路径。
而不是:
execfile("..\\UserScripts\\HelloWorld.py")我需要打个电话:
execfile("HelloWorld.py")有没有一个sys.path,我可以把它添加到其中,让它工作?目录是固定的,工作目录和文件的位置也是固定的。期望的是,用户可以将文件放入UserScripts目录,并期望能够在没有相对文件路径的情况下通过解释器调用它。
发布于 2016-07-14 11:42:54
下面的脚本假定HelloWorld.py与您的可执行文件在同一目录中。
import os.path
import sys
execfile(os.path.join( os.path.dirname(sys.argv[0]), 'HelloWorld.py'))但是,如果您有一个保存代码段的子目录(我们称其为‘../UserSnippet’),则可以指定相对于包含execfile的脚本的路径:
execfile(os.path.join( os.path.dirname(sys.argv[0]), '..','UserSnippets','HelloWorld.py'))使用os.path.join可以保持代码的可移植性(我希望,我只在我的Mac上测试过)。
发布于 2014-02-28 21:00:26
我强烈建议使用不同的名称(比如execscript),您可以将其添加到在其中执行用户脚本的作用域:
scope.SetVariable("execscript", (CodeContext context, string filename) => {
Builtins.execfile(context, Patch.Combine("../../Scripts", filename));
});这将使它看起来像一个内置的,而不会弄乱内置的字典。
如果一定要使用execfile,最好的办法就是用一个可以修补目录然后调用旧execfile的内置and替换掉它。下面是一些完全未经测试、未经编译的代码,它们可以为您指明正确的方向:
var engine = Python.CreateEngine();
var builtins = engine.GetBuiltinModule();
builtins.SetVariable("execfile", (CodeContext context, string filename) => {
Builtins.execfile(context, Patch.Combine("../../Scripts", filename));
});https://stackoverflow.com/questions/22073848
复制相似问题