我有一个小的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
行时,我的脚本在完成之前不再需要密码。我想知道:
这些python脚本实际上是如何运行的?由于cd
命令没有永久效果。我假设脚本将自己的私有子进程与终端正在进行分离,然后在脚本完成时自行终止?
根据#1的工作原理,如何强制我的脚本永久更改终端目录以节省时间,
为什么只运行更改目录会询问我的密码?
完整的脚本如下,谢谢,
科迪
#!/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))
答案 0 :(得分:1)
您无法使用Popen
更改正在运行的脚本的当前目录。 Popen
将创建一个具有自己环境的新流程。如果你在其中执行cd
,它将更改正在运行的进程的目录,然后立即退出。
如果要更改脚本的目录,可以使用os.chdir(path)
,那么脚本中的所有后续命令都将从该新路径运行。
子进程不能改变父母的环境,因此您无法创建一个进程来改变调用者的环境。