Shell命令仅在手动执行而不是从Python文件执行时才起作用

Shell命令仅在手动执行而不是从Python文件执行时才起作用,python,shell,command-line,subprocess,Python,Shell,Command Line,Subprocess,我有一个运行Ubuntu 16.04的VPS,我正在使用Python来自动化一些任务。我编写了一个简单的脚本,使用该命令一次创建多个用户newusers读取包含用户数据的文件,并基于该数据创建新用户。 我在脚本中首先要做的是创建一个名为users.txt的文件,我将所有用户数据都放在其中。之后,我在脚本中稍后调用该文件上的newusers,以便实际创建用户 我尝试同时使用os和subprocess模块来调用命令sudo newusers.txt,但是这两个模块都不起作用。但是,当我直接从命令行运

我有一个运行Ubuntu 16.04的VPS,我正在使用Python来自动化一些任务。我编写了一个简单的脚本,使用该命令一次创建多个用户
newusers
读取包含用户数据的文件,并基于该数据创建新用户。 我在脚本中首先要做的是创建一个名为
users.txt
的文件,我将所有用户数据都放在其中。之后,我在脚本中稍后调用该文件上的
newusers
,以便实际创建用户

我尝试同时使用os和subprocess模块来调用命令
sudo newusers.txt
,但是这两个模块都不起作用。但是,当我直接从命令行运行该命令时,它确实起作用

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

create_users = subprocess.Popen(['sudo', 'newusers', 'users.txt'], shell=True)
在这里,我尝试使用操作系统:

os.system('sudo newusers.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')
是指向整个代码的链接

问题是,当我手动(直接从命令行)运行sudo newusers.txt时,命令运行得非常好。它唯一不起作用的时候是从Python脚本运行它

我在想,在我能够运行
sudo newusers.txt

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

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

PS:权限不是问题,因为我是root用户


我将感谢任何帮助

找到了问题。当我创建
users.txt
文件时,我没有关闭它。如本视频中所述,关闭文件将“将文件描述符(资源)返回到操作系统”。这是一个愚蠢的错误,我不会再重复了。我现在总是使用
with
语句


谢谢,@Reductio和@Davis Herring对你的帮助

找到了问题。当我创建
users.txt
文件时,我没有关闭它。如本视频中所述,关闭文件将“将文件描述符(资源)返回到操作系统”。这是一个愚蠢的错误,我不会再重复了。我现在总是使用
with
语句


谢谢,@Reductio和@Davis Herring对你的帮助

如果你是root用户,为什么要运行
sudo
?我知道我不需要,但这并没有什么区别。。。(就是这样,没有具体的原因。)我不明白为什么你的“os.system”调用不起作用。然而,你的电话似乎是错的。据我所知,您应该使用“subprocess.Popen('sudo newusers.txt',shell=True)”或者最好使用“subprocess.Popen(['sudo',newusers',users.txt')”,为什么第二个更好?它们不同吗?在这种情况下可能不会,但是->如果你是root用户,为什么要运行
sudo
?我知道我不需要,但这并没有什么区别。。。(就是这样,没有具体的原因。)我不明白为什么你的“os.system”调用不起作用。然而,你的电话似乎是错的。据我所知,您应该使用“subprocess.Popen('sudo newusers.txt',shell=True)”或者最好使用“subprocess.Popen(['sudo',newusers',users.txt')”,为什么第二个更好?它们不同吗?但是,在这种情况下,可能不会->