我有一个运行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,所以权限不是问题。
我将不胜感激!
答案 0 :(得分:0)
发现了问题。创建users.txt
文件时,没有关闭它。如本视频https://www.youtube.com/watch?v=iba-I4CrmyA&t=487s所述,关闭文件将:“将文件描述符(资源)返回给操作系统”。这是一个愚蠢的错误,我不再赘述。我现在总是使用with
语句。
感谢@Reductio和@Davis Herring对您的帮助!