我正在尝试使用python执行一些shell命令:
命令为.steps-one,
.steps-two,
.steps-three,
.steps-four,
.steps-five{
outline: 1px dashed rgba(green, $outline-width);
@media screen and (max-width: $break-point) {
margin-left: -25px;
}
@media screen and (min-width: $break-point) {
float: left;
width: 25%;
margin-top: -50px;
}
}
它通过shell工作正常,但是当通过python执行时它不起作用:
cd /home/n1603031f/Desktop/parsec/wd/
错误:
path_to_wd = "/home/n1603031f/Desktop/parsec/wd/"
call(["cd",path_to_wd])
我需要这个命令才能工作,因为我要执行的原始命令是:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
仅当您更改目录以不在.tar文件中创建顶级文件夹时才能正常工作
答案 0 :(得分:2)
即使您有正确的调用来更改目录,它也无法实现您的目标,因为每个subprocess.call
都会创建一个单独的进程。
你真正需要的是cwd
subprocess.Popen
参数来说明你想要使用的目录。另外你需要使用os.listdir
因为子进程调用赢了通过shell来扩展*
glob。这是做你正在尝试做的事情的正确方法:
d = './parsec/wd'
subprocess.Popen(['tar', '-cf', '../abcd.tar'] + os.listdir(d), cwd=d).wait()
但是,os.listdir
也会列出隐藏文件,如果您愿意,可以事先将其过滤掉:
files = [f for f in os.listdir(d) if not f.startswith('.')]
如果确实需要(而且你不是),你可以使用shell=True
将其与*
一起使用。虽然除非您正在使用受信任的输入shell=True
,否则它被广泛视为安全漏洞。
subprocess.Popen('tar -cf ../abcd.tar *', shell=True, cwd='./parsec/wd').wait()
如果您需要python进程来更改它的当前工作目录,请使用
os.chdir('./parsec/wd')