永久更改目录python脚本/ python脚本运行的环境是什么?

时间:2015-06-25 16:30:50

标签: python linux scripting

我有一个小的git_cloner脚本,可以正确克隆我的公司项目。在我的所有脚本中,我使用的函数还没有给我带来任何问题:

def call_sp(
command, **arg_list):
        p = subprocess.Popen(command, shell=True, **arg_list)
        p.communicate()

在这个单独的脚本的末尾,我使用:

call_sp('cd {}'.format(branch_path))

这一行不会改变我将脚本运行到目录branch_path的终端,事实上,更糟糕的是,它烦人地要求我输入密码!删除上面的cd yadayada行时,我的脚本在完成之前不再需要密码。我想知道:

  1. 这些python脚本实际上是如何运行的?由于cd命令没有永久效果。我假设脚本将自己的私有子进程与终端正在进行分离,然后在脚本完成时自行终止?

  2. 根据#1的工作原理,如何强制我的脚本永久更改终端目录以节省时间,

  3. 为什么只运行更改目录会询问我的密码?

  4. 完整的脚本如下,谢谢,

    科迪

    #!/usr/bin/env python
    
    import subprocess
    import sys
    import time
    from os.path import expanduser
    
    home_path = expanduser('~')
    project_path = home_path + '/projects'
    
    
    d = {'cwd': ''}
    
    
    
    #calling from script:
    # ./git_cloner.py projectname branchname
    # to make a new branch say ./git_cloner.py project branchname
    
    #interactive:
    # just run ./git_cloner.py
    
    
    
    
    if len(sys.argv) == 3:
        project = sys.argv[1]
        branch  = sys.argv[2]
    
    
    
    if len(sys.argv) < 3:
        while True:
            project = raw_input('Enter a project name (i.e., mainworkproject):\n')
            if not project:
                continue
            break
    
        while True:
            branch = raw_input('Enter a branch name (i.e., dev):\n')
            if not branch:
                continue
            break
    
    
    
    
    def call_sp(command, **arg_list):
        p = subprocess.Popen(command, shell=True, **arg_list)
        p.communicate()
    
    
    
    
    print "making new branch \"%s\" in project \"%s\"" % (branch, project)
    
    
    
    
    this_project_path = '%s/%s' % (project_path, project)
    branch_path  = '%s/%s' % (this_project_path, branch)
    
    d['cwd'] = project_path
    call_sp('mkdir %s' % branch, **d)
    d['cwd'] = branch_path
    git_string = 'git clone ssh://git@git/home/git/repos/{}.git {}'.format(project, d['cwd'])
    #see what you're doing to maybe need to cancel
    print '\n'
    print "{}\n\n".format(git_string)
    call_sp(git_string)
    time.sleep(30)
    call_sp('git checkout dev', **d)
    time.sleep(2)
    call_sp('git checkout -b {}'.format(branch), **d)
    time.sleep(5)
    #...then I make some symlinks, which work
    call_sp('cp {}/dev/settings.py {}/settings.py'.format(project_path, branch_path))
    print 'dont forget "git push -u origin {}"'.format(branch)
    call_sp('cd {}'.format(branch_path))
    

1 个答案:

答案 0 :(得分:1)

您无法使用Popen更改正在运行的脚本的当前目录。 Popen将创建一个具有自己环境的新流程。如果你在其中执行cd,它将更改正在运行的进程的目录,然后立即退出。

如果要更改脚本的目录,可以使用os.chdir(path),那么脚本中的所有后续命令都将从该新路径运行。

子进程不能改变父母的环境,因此您无法创建一个进程来改变调用者的环境。