gpt4 book ai didi

python - 永久更改目录 python 脚本/python 脚本在什么环境中运行?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:24 26 4
gpt4 key购买 nike

我有一个小的 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 命令没有永久效果。我假设脚本将其自己的私有(private)子进程与终端正在执行的操作分开,然后在脚本完成时自行终止?

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

  3. 为什么仅仅运行更改目录就会要求我输入密码?

完整的脚本如下,谢谢,

科迪

#!/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))

最佳答案

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

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

虽然子进程无法改变其父进程的环境,因此您不能让您创建的进程改变调用者的环境。

关于python - 永久更改目录 python 脚本/python 脚本在什么环境中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31055871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com