2011-09-05 81 views
1

好的,所以我有以下情况。我需要在目标PC上动态编辑PYTHONPATH。目前该项目的结构是:sh脚本相当于python脚本

trunk 
    bin 
     start_script 
    dependencies 
     dependencies 

蟒蛇我能做到,从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脚本会在这里更好地完成这项工作,不幸的是我在这里总是noob,并且不知道如何继续。该sh脚本应该基本上做的事情蟒蛇从上面一样,所以:

[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

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

+0

什么是目标平台?例如,在Linux上,你可以期望人们有'realpath',但是在OSX上,例如,它不是标准的。 Que Larry Wall在这里引用:“编写可移植shell比编写可移植shell脚本更容易”。 – tripleee

+0

@MatToufoutu这是一个答案!回答并获得投票! –

回答

4

你可以只在您更新Start_script中sys.path同一时刻更新PYTHONPATH环境变量,使用os.environ字典。

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不是无,它必须是用于定义新处理的环境变量的映射;这些用来代替继承当前进程的环境,这是默认行为。

或者,如果你只是想启动一个蟒蛇过程中,你可以简单地使用multiprocessing模块。从文档

例子:

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 
+0

问题是子过程开始于:子流程。Popen(['python','-m',MODULE_TO_START]) – Bogdan

+0

你为'start_script.py'编写了一个包装脚本? – tauran