【问题标题】:call function not working with cd command [duplicate]调用函数不适用于 cd 命令 [重复]
【发布时间】:2016-12-22 08:44:36
【问题描述】:

我正在尝试使用 python 执行一些 shell 命令:

命令是cd /home/n1603031f/Desktop/parsec/wd/

通过 shell 可以正常工作,但是通过 python 执行时就不行了:

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

我需要这个命令来工作,因为我要执行的原始命令是:

cd ./parsec/wd/ && tar -cf ../abcd.tar *

仅当您将目录更改为不在 .tar 文件中创建顶级文件夹时才能正常工作

【问题讨论】:

  • call(["cd", path_to_wd], shell=True) 在 Windows 上为我工作。

标签: python shell


【解决方案1】:

即使您有正确的调用来更改目录,它也不会完成您想要的,因为每个subprocess.call 都会创建一个单独的进程。

您真正需要的是 subprocess.Popencwd 参数来说明您要在哪个目录中工作。此外,您需要使用 os.listdir,因为子进程调用不会通过 shell 来扩展 @ 987654325@ 全球。这是做你想做的事情的正确方法:

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

【讨论】:

  • subprocess.Popen('tar -cf ../abcd.tar *', shell=True, cwd='./parsec/wd').wait() 是我使用和工作的。谢谢你的时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2016-05-09
  • 2017-11-15
  • 2023-03-15
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多