Shell命令仅在手动执行而不是从Python文件执行时才起作用
我有一个运行Ubuntu 16.04的VPS,我正在使用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,但是这两个模块都不起作用。但是,当我直接从命令行运
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')”,为什么第二个更好?它们不同吗?但是,在这种情况下,可能不会->