os.system(<command>) 通过 Python 执行 :: 限制?

os.system(<command>) execution through Python :: Limitations?

我正在编写一个 python(2.7 版)脚本来自动执行此入门 example for INOTOOL 中的命令集。

问题:当我 运行 这整个脚本时,我反复遇到这些错误:

Current Directory is not empty  
No project is found in this directory  
No project is found in this directory  

但是,当我 运行 第一个脚本只到标记的代码行,然后手动输入接下来的三行时,或者当我 运行 最后三行(从"ino init -t blink" 行)手动访问 beep 文件夹后,我就能够成功执行相同的代码。

我遇到的 os.system() 有限制吗?

我的代码:

import os,sys  
def upload()  
    os.system("cd /home/pi/Downloads")  
    os.system("mkdir beep")  
    os.system("cd beep") #will refer to this code junction in question description  
    os.system("ino init -t blink")  
    os.system("ino build")  
    os.system("ino upload")  
    sys.exit(0)

你可以使用subprocess module和os.mkdir来创建目录,你可以将当前工作目录cwd传递给check_call所以你实际上执行命令目录:

from subprocess import check_call
import os 
def upload(): 
    d = "/home/pi/Downloads/beep"
    os.mkdir(d)
    check_call(["ino", "init", "-t", "blink"],cwd=d)  
    check_call(["ino", "build"],cwd=d)  
    check_call(["ino", "upload"],cwd=d) 

非零退出状态将引发 CalledProcessError,您可能想捕获它,但一旦成功,您就会知道所有命令都返回了 0 退出状态。

是的,当 os.system() 命令是 cd 的 运行 时,它实际上并没有更改 python 进程上下文的当前目录。来自 documentation -

os.system(command)

Execute the command (a string) in a subshell. This is implemented by calling the Standard C function system(), and has the same limitations. Changes to sys.stdin, etc. are not reflected in the environment of the executed command.

因此,即使您在 os.system() 调用中更改目录,下一个 os.system 调用仍会在同一目录中发生。这可能会导致您的问题。

您应该尝试使用 os.chdir() 来更改目录而不是 os.system() 调用。

最好是使用 subprocess 模块,正如@PadraicCunningham 在他的回答中解释的那样。