【问题标题】:Run Python system commands on solaris在 solaris 上运行 Python 系统命令
【发布时间】:2012-03-07 06:59:50
【问题描述】:
我在 solaris 环境中运行 python 命令。我无法对其执行 subprocess.call,因为它在 execute_child“[Errno 2] 没有这样的文件或目录”中给我一个错误。我尝试了使用 popen2/3/4 的替代方法,但它引发错误“DeprecationWarning:不推荐使用 popen2 模块。使用 subprocess 模块。”由于某些限制,我不想使用 os.system。还有其他方法可以使这项工作吗?
任何帮助将不胜感激。
【问题讨论】:
标签:
python
solaris
subprocess
popen
【解决方案1】:
你试过subprocess.popen()吗?很简单:
output, error = subprocess.popen(your_command, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE);
replacespopen2(),确实已弃用:
os.popen2(cmd[, mode[, bufsize]])
2.6 版后已弃用:此功能已过时。使用
子流程模块。特别检查替换旧功能
子流程模块部分。
关于No such file or directory错误,尝试使用绝对路径。
【解决方案2】:
下面是我编写的 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)