sh脚本相当于python脚本的实现

1 投票
3 回答
670 浏览
提问于 2025-04-17 01:28

好的,我现在有这样的情况。我需要在目标电脑上动态地编辑PYTHONPATH。现在项目的结构是:

trunk
     bin
        start_script
     dependencies
        dependencies

从Python的启动脚本中,我可以这样做:

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

所以基本上前两步是我需要帮助的地方。如果有办法让通过subprocess.Popen打开的子进程中的Python的sys.path的修改保持有效,请告诉我。

3 个回答

0

为什么不使用 env 参数来设置 subprocess.Popen 呢?

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()
1

我会使用一个 .pth 文件。可以参考这个链接:http://docs.python.org/install/index.html#inst-search-path

一个 .pth 文件就是一个文本文件,每一行写一个目录的路径。它会把这些目录添加到你的 Python 路径中。

这样做可能比执行 shell 脚本要好,因为后者有很多缺点,比如安装过程更复杂,可能会影响可移植性等等。

4

你可以在更新 sys.path 的同时,直接更新 PYTHONPATH 这个环境变量。可以通过 os.environ 这个字典来做到这一点。

撰写回答