【问题标题】:subprocess.call cd not working [duplicate]subprocess.call cd 不工作[重复]
【发布时间】:2015-10-07 19:55:57
【问题描述】:
In [3]: pwd

Out[3]: u'/Users/aarcher/Desktop/scripts'


In [5]: subprocess.call(['mkdir', '-p', os.path.expanduser('~/file/path/name')])

Out[5]: 0

我在另一个终端中验证它已成功创建 /Users/aarcher/file/path/name,但无法更改到该目录,即使它返回 0:

In [7]: subprocess.call(['cd', os.path.expanduser('~/file/path/name')], shell=True)

Out[7]: 0

In [8]: pwd

Out[8]: u'/Users/aarcher/Desktop/scripts'

我在unix盒子里

【问题讨论】:

  • 当你生成一个子shell并改变目录时,一旦那个子shell关闭它就消失了。修改 subshel​​l 中的 pwd 不会影响 parent。也许您想用os.chdir 更改密码? docs.python.org/2/library/os.html 。你也可以通过调用os.mkdir 来做类似的事情(没有子进程)。 os 模块的优势在于它旨在实现可移植性(因此您无需了解操作系统使用的底层机制)

标签: python subprocess


【解决方案1】:

subprocess.call() 创建一个 进程。 cd 在该进程中工作,但是当进程退出时,它不会影响当前进程。这就是流程的设计方式。

如果您需要将脚本更改为其他目录,您可以使用os.chdir,它将更改当前进程的目录。

【讨论】:

  • 当我使用 os.chdir 时,它不会导致程序终止后位于不同的目录中。我想命令行本身是一个不同的过程。
  • @Brōtsyorfuzthrāx:“当我使用 os.chdir 时,它不会导致程序终止后位于不同的目录中” - 正确,这就是操作系统和 shell 的工作方式.子进程不能影响父进程。另一个例子是子进程不能改变父进程中的环境变量。
  • 谢谢。我找到了 gspr 对另一个问题 (stackoverflow.com/questions/3786678/…) 的回答,它解决了一种有用的替代方法(执行 os.chdir(myDir) 后跟 subprocess.run(["bash"]) 以在所需目录中打开一个新 shell,而不更改旧 shell;键入 @987654326 @当然可以回到旧的)。
  • 哦。您还可以在您键入 exit 后让它运行更多代码(只需在 subprocess.run["bash"] 之后添加更多代码),但同时,如果您想在旧 shell 中运行更多代码,您必须这样做(所以打开新的shell应该是最后一个需要完成的任务,大部分时间)。
【解决方案2】:

对于这项任务,使用 suprocess 不是一个好主意。只需使用 python os 模块 试试这个::

In [12]: import os 

In [13]: os.getcwd()
Out[13]: '/home/najeeb'

In [14]: os.chdir('/home/najeeb/Desktop/project/')

In [15]: os.getcwd()
Out[15]: '/home/najeeb/Desktop/project'

In [16]: 

如果您现在遇到任何问题,请告诉我!

【讨论】:

  • 如果你在 /home/najeeb 目录中,然后你想进入桌面目录,它是 najeeb 的子目录,只需使用 os.chdir('Desktop') 它将更改目录。跨度>
猜你喜欢
  • 2014-05-18
  • 2018-10-17
  • 2017-09-24
  • 2013-07-27
  • 2012-10-13
  • 2011-05-16
  • 2013-03-02
  • 2013-11-08
  • 2022-01-19
相关资源
最近更新 更多