调用函数不能与cd命令一起使用

时间:2016-08-16 05:10:43

标签: python shell

我正在尝试使用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文件中创建顶级文件夹时才能正常工作

1 个答案:

答案 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')