1

好的,所以我有以下情况。我需要在目标 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

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

4

3 回答 3

4

您可以使用dict在 start_script 中PYTHONPATH更新的同时更新环境变量。sys.pathos.environ

于 2011-09-05T13:25:31.500 回答
1

我会使用一个.pth文件。请参阅http://docs.python.org/install/index.html#inst-search-path

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

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

于 2011-09-05T13:00:45.323 回答
0

为什么不使用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()
于 2011-09-05T11:43:52.697 回答