【问题标题】:execfile with automatic relative path具有自动相对路径的 execfile
【发布时间】:2014-02-27 16:02:54
【问题描述】:

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

代替:

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

我需要打电话:

execfile("HelloWorld.py")

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

【问题讨论】:

  • 你能改变当前的工作目录吗?
  • 不,当前工作目录是固定的;和 HelloWorld.py 的位置一样,它们不是同一个目录,但它们的相对路径总是相同的。

标签: python python-2.7 ironpython execfile


【解决方案1】:

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

import os.path
import sys

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

但是,如果您有一个保存 sn-ps 的子目录(我们称之为“../UserSnippets”),您可以指定相对于包含 execfile 的脚本的路径:

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

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

【讨论】:

    【解决方案2】:

    我强烈建议您使用不同的名称(例如 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));
    });
    

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2016-08-03
      • 2011-07-30
      • 2015-01-21
      相关资源
      最近更新 更多