メモ:python呼び出しshellとC

2812 ワード

python呼び出しC:
やはりshellはlinux関連を得るのが簡単です.
現在cmdが使いやすいことが分かった.しかし、長いshellコマンドには向いていません.シナリオにしか書けませんね...[一番使いやすい方法は???
pythhonがCを呼び出すと、Cに渡されるパラメータ=======ダイレクトポイントが間違っていることがわかります..文字列受信は可能です.
C++はpython呼び出しのためにsoにコンパイルされ、コマンド:
 g++ perm.cpp -fPIC -shared -o perm.so
python 
pythonコード:
import sys
import os
import glob
import subprocess
import shutil
import traceback
import fcntl
import signal
import ConfigParser
import time


def get_files():
        global file
        cmd = ["sh", "./test.sh"]
        process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
        out = process.communicate()
        if process.returncode == 0 and out[0].strip() != "NULL":
            """ print out
             for i in range(len(out)):
                print out[i].strip()"""
            number_i = out[0].strip()
            print number_i
            import ctypes
            so = ctypes.CDLL("./perm.so")
            ret = so.v_perm_v(number_i)
            print("the return value is:")
            print ret


def main(argv=None):
    """creates a parser for the command line arguments and runs the program for
       those arguments"""
    get_files()

if __name__ == "__main__":
    sys.exit(main())

~
ls /home/vivi | wc -l

shell:

ls /home/vivi | wc -l

Cコード:
#include 
#include 
#define  elemType  int

void arrySwap(elemType arr[], elemType a, elemType b)
{
    elemType temp;
    temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

int cnt = 0;
void perm(elemType arr[], int start, int end)
{
    if(start == end)
    {
        cnt++;
        printf("%d :/t",cnt);

        for(int i = 0; i <= end; i++)
            printf("%d ", arr[i]);

        printf("
"); } else { for(int i = start; i <= end; i++) { arrySwap(arr, start, i); perm(arr, start + 1, end); arrySwap(arr, start, i); } } } extern "C" { int v_perm_v(char* len_c) { //printf("len_c = %s
",len_c); int len = (int)(len_c[0] - '0'); //printf("len = %d
", len); if(len <= 0) return -1; int *arr = (int *)malloc(sizeof(int) * len); if(arr == NULL) return -1; for(int i = 0; i < len; i++) { arr[i] = i; //printf("%d ", arr[i]); } perm(arr, 0, len - 1); return 0; } }