gpt4 book ai didi

python - 为什么python的递归复制和命令行不一样?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:19 24 4
gpt4 key购买 nike

我正在尝试在我的 python 脚本中对目录结构进行递归复制。当我通过 bash 命令行进行复制时:

mike@mike-VirtualBox:~/head$ cp -rf ./applications/app_template/ ./applications/my_dir

我得到了预期的结果:

mike@mike-VirtualBox:~/head$ tree ./applications/my_dir/
./applications/my_dir/
├── cdl
│ ├── include
│ ├── Makefile
│ ...
│ └── other
├── cds
│ ├── include
...

但是当我尝试通过我的 Python 脚本做同样的事情时:

print "./applications/"+tar_dir
os.system("cp -rf ./applications/app_template/ ./applications/"+tar_dir)

我得到:

mike@mike-VirtualBox:~/head$ tree ./applications/my_dir/
./applications/my_dir/
└── app_template <--- why did it copy that too?
├── cdl
│ ├── include
│ ├── Makefile
│ ...
│ └── other
├── cds
│ ├── include
...

我的 python 脚本的打印显示我正在使用相同的目标:

./applications/my_dir

你可以看到我的命令的其余部分是一样的。那么,为什么使用 os.system() 时得到的输出与直接从 shell 运行命令时得到的输出不同?

最佳答案

似乎 os.system 将其执行的 shell 更改为 sh:

mike@mike-VirtualBox:~/head$ echo $0
bash

mike@mike-VirtualBox:~/head$ python
Python 2.7.3 (default, Apr 10 2013, 06:20:15)
>>> import os
>>> os.system("echo $0")
sh

当使用 bash shell 通过 Popen 执行复制命令时,它按预期工作:

>>> import subprocess as sp
>>> sp.Popen("cp -rf ./applications/icom_app_template ./applications/my_dir",
shell=True, executable="/bin/bash")
>>> exit()
mike@mike-VirtualBox:~/head$ tree ./applications/my_dir/
./applications/my_dir/
├── cdl
│ ├── include
│ ├── Makefile
│ ...
│ └── other
├── cds
│ ├── include
...

唯一我没有答案的奇怪之处是,如果我在命令行(Python 之外)切换到 sh shell 并执行相同的 cp 命令,它可以在不复制父"template"目录的情况下工作。奇怪...但是切换到 Popen 并强制使用 bash shell 似乎解决了我的问题。

关于python - 为什么python的递归复制和命令行不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17602217/

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