python程序中如何连续调用cmd命令

python程序中如何连续调用cmd命令,第1张

楼上只能显示一下就没了。如果想调用,并传入特定的参数,并将反馈的结果保存。用subprocess模块,调用Popen(command,shell=True,PIPE=stdout)stdout。pipe也是这个模块里面的,你要先导入这个方法

这个函数的功能应该是读取当前目录下的内容的

popen可以启动一个新的进程,ls -l则是要启动进程得程序名和参数,ls -l当然即使列出目录的意思咯

"r"是代表调用进程可以通过返回的文件指针读取到新启动的进程的输出。也可以是"w",这样调用进程就可以通过向文件写内容而新启动的进程从标准输入读取。事实上这就是进程间的管道通信。

popen返回一个文件指针,返回空指针也就是0即出错咯。

下面的while循环,就是把返回的文件的内容读取到传入的sck文件描述符所指向的文件中,fileno是把文件指针转换为文件描述符

pclose函数就是关闭这个管道,它的返回值是新启动的这个程序的退出码,

一般来说程序都返回0代表正确嘛,非零当然就表示程序可能有问题,如果是pclose函数错误会返回-1

先调用pipe,再调用fork,把子进程的标准输入和输出调用dup,到pipe的两个端,

通过pipe读取子进程的输出,并且可以:

通过pipe给子进程输入(可选)

调用wait等待子进程结束。

大体就这个意思

建议使用subprocessPopen替换掉你现在使用的popen2

ssh是个特殊的工具,他并不是完全从标准输入读入数据,所以你不能使用这些管道来通信,包括popen2,Popen等。

为什么是/而不是\?

\才是windows下的路径分割符合啊!

借用楼上的

import os

ossystem(r'"D:\Program Files\Foxit Software\Foxit readerexe" abcpdf')

偶想""是不可缺少的,因为路径中有空格,否则极容易出错;对-参数不了解,不发表意见

使用ossystem会有几个问题:

1、ossystem会阻塞程序继续运行(如果是图形界面,还会把图形界面搞的没反应),当然如果需要阻塞,自然不是问题。

2、ossystem会打开一个命令行窗口,这是比较讨厌的;除非你确实需要显示这个命令行窗口或者本来就是命令行里运行的。

所以还是建议使用 ospopen,基本语法是一样的

import os

ospopen(r'"D:\Program Files\Foxit Software\Foxit readerexe" abcpdf')

这样不会出现命令行窗口,不会阻塞程序运行

如果需要阻塞程序运行,可以这样写:

ospopen(r'"D:\Program Files\Foxit Software\Foxit readerexe" abcpdf')read()

二、Python调用C/C++

1、Python调用C动态链接库

Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。

(1)C语言文件:pycallc

[html] view plain copy

/gcc -o libpycallso -shared -fPIC pycallc/

#include <stdioh>

#include <stdlibh>

int foo(int a, int b)

{

printf("you input %d and %d\n", a, b);

return a+b;

}

(2)gcc编译生成动态库libpycallso:gcc -o libpycallso -shared -fPIC pycallc。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern "C"来进行编译。

(3)Python调用动态库的文件:pycallpy

[html] view plain copy

import ctypes

ll = ctypescdllLoadLibrary

lib = ll("/libpycallso")

libfoo(1, 3)

print 'finish'

(4)运行结果:

2、Python调用C++(类)动态链接库

需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern "C",构建后的动态链接库没有这些函数的符号表。

(1)C++类文件:pycallclasscpp

[html] view plain copy

#include <iostream>

using namespace std;

class TestLib

{

public:

void display();

void display(int a);

};

void TestLib::display() {

cout<<"First display"<<endl;

}

void TestLib::display(int a) {

cout<<"Second display:"<<a<<endl;

}

extern "C" {

TestLib obj;

void display() {

objdisplay();

}

void display_int() {

objdisplay(2);

}

}

(2)g++编译生成动态库libpycallso:g++ -o libpycallclassso -shared -fPIC pycallclasscpp。

(3)Python调用动态库的文件:pycallclasspy

[html] view plain copy

import ctypes

so = ctypescdllLoadLibrary

lib = so("/libpycallclassso")

print 'display()'

libdisplay()

print 'display(100)'

libdisplay_int(100)

(4)运行结果:

3、Python调用C/C++可执行程序

(1)C/C++程序:maincpp

[html] view plain copy

#include <iostream>

using namespace std;

int test()

{

int a = 10, b = 5;

return a+b;

}

int main()

{

cout<<"---begin---"<<endl;

int num = test();

cout<<"num="<<num<<endl;

cout<<"---end---"<<endl;

}

(2)编译成二进制可执行文件:g++ -o testmain maincpp。

(3)Python调用程序:mainpy

[html] view plain copy

import commands

import os

main = "/testmain"

if ospathexists(main):

rc, out = commandsgetstatusoutput(main)

print 'rc = %d, \nout = %s' % (rc, out)

print ''10

f = ospopen(main)

data = freadlines()

fclose()

print data

print ''10

ossystem(main)

(4)运行结果:

4、扩展Python(C++为Python编写扩展模块)

所有能被整合或导入到其它python脚本的代码,都可以被称为扩展。可以用Python来写扩展,也可以用C和C++之类的编译型的语言来写扩展。Python在设计之初就考虑到要让模块的导入机制足够抽象。抽象到让使用模块的代码无法了解到模块的具体实现细节。Python的可扩展性具有的优点:方便为语言增加新功能、具有可定制性、代码可以实现复用等。

为 Python 创建扩展需要三个主要的步骤:创建应用程序代码、利用样板来包装代码和编译与测试。

(1)创建应用程序代码

[html] view plain copy

#include <stdioh>

#include <stdlibh>

#include <stringh>

int fac(int n)

{

if (n < 2) return(1); / 0! == 1! == 1 /

return (n)fac(n-1); / n! == n(n-1)! /

}

char reverse(char s)

{

register char t, / tmp /

p = s, / fwd /

q = (s + (strlen(s) - 1)); / bwd /

while (p < q) / if p < q /

{

t = p; / swap & move ptrs /

p++ = q;

q-- = t;

}

return(s);

}

int main()

{

char s[BUFSIZ];

printf("4! == %d\n", fac(4));

printf("8! == %d\n", fac(8));

printf("12! == %d\n", fac(12));

strcpy(s, "abcdef");

printf("reversing 'abcdef', we get '%s'\n", \

reverse(s));

strcpy(s, "madam");

printf("reversing 'madam', we get '%s'\n", \

reverse(s));

return 0;

}

上述代码中有两个函数,一个是递归求阶乘的函数fac();另一个reverse()函数实现了一个简单的字符串反转算法,其主要目的是修改传入的字符串,使其内容完全反转,但不需要申请内存后反着复制的方法。

(2)用样板来包装代码

接口的代码被称为“样板”代码,它是应用程序代码与Python解释器之间进行交互所必不可少的一部分。样板主要分为4步:a、包含Python的头文件;b、为每个模块的每一个函数增加一个型如PyObject Module_func()的包装函数;c、为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组;d、增加模块初始化函数void initModule()。

以上就是关于python程序中如何连续调用cmd命令全部的内容,包括:python程序中如何连续调用cmd命令、linuxC关于popen、pclose、python中的popen如何用c++实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9808472.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存