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

我有一个运行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。

我将不胜感激任何帮助!

参考方案

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

谢谢@Reductio和@Davis Herring的帮助!

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:如何根据另一列元素明智地查找一列中的空单元格计数? - python

df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice','Jane', 'Alice','Bob', 'Alice'], 'income…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

将字符串分配给numpy.zeros数组[重复] - python

This question already has answers here: Weird behaviour initializing a numpy array of string data                                                                    (4个答案)         …