【问题标题】:call ctypes.execve with dynamic list of argumenst使用动态参数列表调用 ctypes.execve
【发布时间】:2019-01-20 17:27:17
【问题描述】:

我想在 python 中使用 ctypes.execve 来调用外部脚本。我已经弄清楚如何调用脚本以及如何传递参数列表。 但正如您所见,列表或参数是完全静态的,我无法弄清楚如何动态地做到这一点。

参数列表应为 python 列表 例如:argv_list = ["./tmp/arg_test.sh", "arg_1", "arg_2"] 这个 python 列表需要以某种方式转换以匹配char * const argv[],以便我可以将它传递给 execve。

cmd = "./tmp/arg_test.sh"
cmd_byte = cmd.encode('utf-8')     # create byte objects from the strings

### works ### ### works ### ### works ### ### works ###

argv_0 = "argv_0"
argv_0_byte = argv_0.encode('utf-8')

argv_1 = "argv_1"
argv_1_byte = argv_1.encode('utf-8')

argv_2 = "argv_2"
argv_2_byte = argv_2.encode('utf-8')

argv_3 = "argv_3"
argv_3_byte = argv_3.encode('utf-8')

b_argv = (ctypes.c_char_p * 5)(argv_0_byte, argv_1_byte, argv_2_byte, argv_3_byte)

### works ### ### works ### ### works ### ### works ###


# int execve(const char * filename, char * const argv[], char * const envp[]);
libc.execve(ctypes.c_char_p(cmd_byte), b_argv, 0)

谢谢!

【问题讨论】:

  • 你知道subprocess 模块吗?它有 Python 函数,可以做你想做的事。不需要ctypes

标签: python ctypes execve


【解决方案1】:

这是一种动态生成参数的方法。这是为 Windows msvcrt 编写的,但也适用于 libc

test.cpp

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    for(int i = 0; i < argc; ++i)
        printf("argv[%d] = \"%s\"\n",i,argv[i]);
    printf("TEST1=%s\n",getenv("TEST1"));
    printf("TEST2=%s\n",getenv("TEST2"));
    return 0;
}

test.py

from ctypes import *

dll = CDLL('msvcrt')
dll._execve.argtypes = c_char_p,POINTER(c_char_p),POINTER(c_char_p)
dll._execve.restype = c_ssize_t

cmd = b'test.exe'
args = [b'arg1',b'arg2',b'arg3']
env = [b'TEST1=hello',b'TEST2=goodbye']

# Convert Python lists to c_char_p arrays.
# Arrays should be null-terminated so adds None to the end.
cargs = (c_char_p * (len(args) + 2))(cmd,*args,None)
cenv = (c_char_p * (len(env) + 1))(*env,None)

dll._execve(cmd,cargs,cenv)

输出:

argv[0] = "test.exe"
argv[1] = "arg1"
argv[2] = "arg2"
argv[3] = "arg3"
TEST1=hello
TEST2=goodbye

【讨论】:

  • 有效!谢谢! (Ubuntu 18.04,Python 3.6.7)
  • @Que 不客气!如果答案有用,请考虑投票。
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2020-08-29
  • 2010-10-15
  • 2011-12-30
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多