os.system(<command />)通过Python :: Limitations执行?

时间:2015-07-08 17:16:03

标签: python arduino os.system

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

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

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

但是,当我运行第一个脚本时,直到标记的代码行,并手动键入接下来的三行,或者当我运行最后三行时(从&#34; ino init -t blink&#开始) 34; line)手动访问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)

2 个答案:

答案 0 :(得分:1)

是的,当为<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/ColorPrimaryDark"> <android.support.v7.widget.CardView android:layout_width="fill_parent" android:layout_height="wrap_content" card_view:cardCornerRadius="10dp" android:layout_marginTop="9dp" android:layout_marginLeft="9dp" android:layout_marginRight="9dp" card_view:cardElevation="0.01dp" android:layout_marginBottom="0dp" card_view:cardPreventCornerOverlap="true" card_view:cardUseCompatPadding="true" card_view:cardBackgroundColor="@color/ColorPrimary"> <RelativeLayout android:id="@+id/top_layout" android:layout_width="fill_parent" android:layout_height="180dp" android:background="@color/ColorPrimary"> <ImageView android:id="@+id/img_thumbnail" android:layout_width="fill_parent" android:layout_height="180dp" android:scaleType="fitXY" android:background="@drawable/korabltest"/> <RelativeLayout android:id="@+id/inner_layout" android:layout_width="fill_parent" android:layout_height="36dp" android:background="#5c1b1b1b" android:layout_gravity="bottom" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> <TextView android:id="@+id/tv_nature" android:layout_width="wrap_content" android:layout_height="50dp" android:paddingLeft="5dp" android:paddingRight="5dp" android:layout_gravity="bottom" android:gravity="center_vertical" android:alpha="0.8" android:textColor="#fff" android:textSize="18sp" android:text="Lexington" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:id="@+id/tv_nature_1" android:layout_width="wrap_content" android:layout_height="50dp" android:paddingLeft="5dp" android:paddingRight="5dp" android:layout_gravity="bottom" android:gravity="center_vertical" android:alpha="0.8" android:textColor="#fff" android:textSize="18sp" android:textStyle="bold" android:text="527 (31%)" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> </RelativeLayout> </RelativeLayout> </android.support.v7.widget.CardView> </LinearLayout> 运行os.system()命令时,它实际上并没有改变python进程的当前目录。上下文。来自documentation -

  

<强>使用os.system(命令)

     

在子shell中执行命令(字符串)。这是通过调用标准C函数系统()来实现的,并且具有相同的限制。对sys.stdin等的更改不会反映在已执行命令的环境中。

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

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

最好的是使用os.system()模块,因为@PadraicCunningham在他的回答中解释道。

答案 1 :(得分:0)

您可以使用subprocess module和os.mkdir来创建目录,您可以将当前工作目录cwd传递给check_call,这样您就可以在目录中执行命令: / p>

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退出状态。