Python os.execve()

问题描述 投票:0回答:2

我正在尝试使用

execve()
模块中的方法
os
生成新进程。我需要生成新进程并在另一个目录中执行一些操作,但我不会更改。

代码:

import os

os.execve('/bin/ls', ['/bin/ls'], {'PATH': '/tmp'})

当我运行此代码时,我得到了我所在目录的内容,而不是来自

/tmp
目录。我做错了什么?我无法使用
os.chdir()
或更改运行命令的方式(例如使用模块
subprocess

python-2.7
2个回答
0
投票

在调用

execve()
之前更改当前工作目录。 CWD 将由新进程继承。

import os
os.chdir('/tmp')
os.execve('/bin/ls', ['arg1', 'arg2'], {'PATH': 'is_inherited_anyway'})

0
投票

如果系统上有

/bin/sh
(应该是),您可以执行以下操作:

import os
target_dir = '/tmp'
your_target_command_with_args = 'ls' # Just put the arguments for the command space-separated in this string, as if this string were your system's default shell.
os.execve('/bin/sh', ['/bin/sh', '-c', f'cd "{target_dir}"; {your_target_command_with_args}'], {})

如果它是专门关于

/bin/ls
,你实际上可以给出一个路径作为参数(其他一些程序也支持给出一个路径作为参数),如下所示:

import os
target_dir = '/tmp'
os.execve('/bin/ls', ['/bin/ls', target_dir], {})

我认为你的方法不起作用,因为

ls
只是不读取
PATH
环境变量来确定要列出的目录,您在第三个参数中设置该目录(当我省略它时,
os.execve
抱怨该参数
env
(位置 3)缺失)。

此外,

PATH
envvar 通常包含一个以冒号分隔的目录列表,在其中搜索命令,如
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
。如果您在任何 shell 中输入命令
ls
,它会在每个目录中搜索名为
ls
的文件,然后运行找到的第一个文件。

© www.soinside.com 2019 - 2024. All rights reserved.