sh脚本相当于python脚本的实现
好的,我现在有这样的情况。我需要在目标电脑上动态地编辑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
这个字典来做到这一点。