【问题标题】:sh script equivalent of python scriptsh 脚本等价于 python 脚本
【发布时间】:2011-09-05 11:32:38
【问题描述】:

好的,所以我有以下情况。我需要在目标 PC 上动态编辑 PYTHONPATH。现在项目的结构是:

trunk
     bin
        start_script
     dependencies
        dependencies

我可以从 python 做,从 start_script 开始:

root_path = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]
dependencies_root = os.path.join(root_path, 'dependencies')
from sys import path
path.extend([root_path, dependencies_root])

这可以解决问题,但我需要使用 process.Popen 启动新的 python 进程,并且对 sys.path 的更改似乎已经消失了。

现在我在想一个 sh 脚本会在这里做得更好,不幸的是我在这里完全是菜鸟,不知道如何继续。 sh 脚本基本上应该完成上面的 python 所做的事情,所以:

[1] Get the absolute path of the directory the script is located
[2] Get the parent of that folder (say parent_path)
[3] export PYTHONPATH=$PYTHONPATH:parent_path
[4] python start_script.py

所以基本上前两个步骤是我需要帮助的步骤。此外,如果有办法对 python 的 sys.path 进行更改,请在使用 subprocess.Popen 打开的子进程上持续存在,请告诉我。

【问题讨论】:

  • 您也可以在更新 start_script 中的sys.path 的同时更新PYTHONPATH 环境变量,使用os.environ 字典。
  • 目标平台是什么?例如,在 Linux 上,您可以期望人们拥有realpath,但在 OSX 上,例如,它不是标准的。 Que Larry Wall 在此引用:“编写可移植 shell 比编写可移植 shell 脚本更容易”。
  • @MatToufoutu 这就是答案!回答并获得投票!
  • @MatToufoutu 谢谢,这正是我所需要的。
  • @tripleee 基本平台是 MacOS,但它最终应该是独立于平台的。

标签: python sh scripting-language


【解决方案1】:

您可以在 start_script 中更新 sys.path 的同时更新 PYTHONPATH 环境变量,使用 os.environ 字典。

【讨论】:

    【解决方案2】:

    我会使用.pth 文件。见http://docs.python.org/install/index.html#inst-search-path

    .pth 文件是每行包含一个目录路径的文件。它会将列出的目录插入到您的 python 路径中。

    这可能比执行 shell 脚本更好,但有它的所有缺点(更复杂的安装、破坏可移植性等)

    【讨论】:

      【解决方案3】:

      为什么不使用subprocess.Popenenv 参数?

      class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
      

      如果env不是None,它必须是定义新进程的环境变量的映射;使用这些而不是继承当前进程的环境,这是默认行为。

      或者,如果您只想启动 python 进程,您可以简单地使用 multiprocessing 模块。

      来自文档的示例:

      from multiprocessing import Process
      
      def f(name):
          print 'hello', name
      
      if __name__ == '__main__':
          p = Process(target=f, args=('bob',))
          p.start()
          p.join()
      

      【讨论】:

      • 问题是子进程开始于:subprocess.Popen(['python', '-m', MODULE_TO_START])
      • 你为start_script.py写了一个包装脚本?
      猜你喜欢
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多