在solaris上运行Python系统命令

时间:2012-03-07 06:59:51

标签: python solaris subprocess popen

我在solaris环境下运行python命令。我无法对它执行subprocess.call,因为它在execute_child“[Errno 2]没有这样的文件或目录”中给出了一个错误。我尝试了使用popen2 / 3/4的替代方法,但它抛出了一个错误“DeprecationWarning:popen2模块已被弃用。使用子进程模块。”由于某些限制,我不想使用os.system。有没有其他方法使这项工作? 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

你试过subprocess.popen()吗?它很简单:

output, error = subprocess.popen(your_command, shell=True, 
                stdout=subprocess.PIPE, stderr=subprocess.PIPE);

replaces popen2(),确实已弃用:

  

os.popen2(cmd [,mode [,bufsize]])

     

从2.6版开始不推荐使用:此功能已过时。使用   子进程模块。特别检查更换旧功能   子流程模块部分。

关于No such file or directory错误,请尝试使用绝对路径。

答案 1 :(得分:0)

下面是我编写的一个python程序的代码,该程序管理Solaris 10系统上的Solaris Volume Manager(SVM)卷。它使用前面描述的相同方法,但在p.communicate()中添加。注意,在这种情况下,stderr输出被重定向到标准输出,因为在这种情况下不需要区分错误消息和正常输出。

# Constants
DATADIR="/etc/lvm"
METASTAT_CMD="/usr/sbin/metastat"
MD_CF = DATADIR + "/md.cf"

def check_svm_volume_exists():
    # Check to see if any SVM volume(s) exist or not. If none exist, exit.
    syscmd = " ".join([METASTAT_CMD, "-p", ">", MD_CF])
    p = subprocess.Popen(syscmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out_data, err_data = p.communicate()

    if out_data == "":
        return out_data 
    else:
        print("No Solaris Volume Manager volume(s) appear to be configured. Exiting.")
        sys.exit(1)