首页 > 解决方案 > Shell 命令仅在手动执行而不是从 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.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')

是整个代码的链接。

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

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

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

当然,我可以简单地运行脚本(这将users.txt创建sudo newusers users.txt.

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

我将不胜感激任何帮助!

标签: pythonshellcommand-linesubprocess

解决方案


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

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


推荐阅读