Shell命令仅在手动执行时有效,而不能从Python文件中执行

时间:2019-04-21 18:40:19

标签: python shell command-line subprocess

我有一个运行Ubuntu 16.04的VPS,并且正在使用Python自动执行某些任务。我编写了一个简单的脚本,该脚本使用newusers命令一次创建多个用户。 newusers读取包含用户数据的文件,并根据该数据创建新用户。 我在脚本中首先要做的是创建一个名为users.txt的文件,在其中放置了所有用户数据。之后,我稍后会在脚本中对该文件调用newusers,以便真正吸引用户。

我尝试同时使用os和subprocess模块​​来调用命令sudo newusers users.txt,但是,两者均无效。但是,当我直接从命令行运行该命令时,它确实可以工作。

在这里,我尝试使用子进程执行命令:

create_users = subprocess.Popen(['sudo', 'newusers', 'users.txt'], shell=True)

我在这里尝试使用os:

os.system('sudo newusers users.txt')

我什至试图创建一个外部文件,然后调用该命令:

make_users = open('make_users.py', 'x')

make_users.write('#!/usr/bin/env python3\n\n\
import os\n\n\
os.system(\'sudo newusers users.txt\')')

os.system('python3 make_users.py')

This是指向整个代码的链接。

问题在于,当我手动(直接从命令行)运行sudo newusers users.txt时,该命令运行正常。唯一不起作用的时间是从Python脚本运行它时。

我在想,也许脚本需要成功退出才能运行sudo newusers users.txt

我没有得到任何错误,实际上,子进程的输出为None。但是当我检查/etc/passwd时,没有创建用户。

当然,我可以简单地运行脚本(将创建users.txt),然后直接从命令行运行sudo newusers users.txt,但是我想了解问题所在以及为什么我无法使用Python执行同一命令。

PS:因为我是root,所以权限不是问题。

我将不胜感激!

1 个答案:

答案 0 :(得分:0)

发现了问题。创建users.txt文件时,没有关闭它。如本视频https://www.youtube.com/watch?v=iba-I4CrmyA&t=487s所述,关闭文件将:“将文件描述符(资源)返回给操作系统”。这是一个愚蠢的错误,我不再赘述。我现在总是使用with语句。

感谢@Reductio和@Davis Herring对您的帮助!