好的,我有以下情况。我需要在目标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 persist,请告诉我。
答案 0 :(得分:4)
您可以使用PYTHONPATH
dict在start_script中更新sys.path
的同时更新os.environ
环境变量。
答案 1 :(得分:1)
我会使用.pth
文件。见http://docs.python.org/install/index.html#inst-search-path
.pth
文件是一个文件,每行包含一个目录路径。它会将列出的目录插入到python路径中。
这可能比执行shell脚本更好,但有所有缺点(更复杂的安装,中断可移植性等)。
答案 2 :(得分:0)
为什么不使用subprocess.Popen的env
参数?
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模块。
docs中的示例:
from multiprocessing import Process
def f(name):
print 'hello', name
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()