-1

我一直在尝试学习 python 装饰器并编写了以下代码。但它不断给出错误。

import os
import sys

def authenticate(fn):
    def wrapper(*args):
        euid = os.geteuid()
        if euid != 0:
            print "This command requires privliged mode. Enter password.."
            args = ['sudo', sys.executable] + sys.argv + [os.environ]
            os.execlpe('sudo', *args)
        fn(*args)
    return wrapper

@authenticate
def show_files(dir):
    files = [f for f in os.listdir(dir)]
    for file in files:
        if os.path.isfile(file):
            print file

dir = raw_input("Please enter a directory name\t")
show_files(dir) 

我得到以下回溯:

Traceback (most recent call last):
    File "auth1.py", line 24, in show_files(dir)
    File "auth1.py", line 11, in wrapper fn(*args)
    File "auth1.py", line 16, in show_files files = [f for f in os.listdir(dir)]
    OSError: [Errno 2] No such file or directory: ''

这个想法是show_files只对可以验证自己的用户运行该功能。我的问题似乎是身份验证的编写方式和execlpe调用方式。任何帮助表示赞赏。

4

2 回答 2

0

您知道问题出在装饰器语法还是 execlpe/sudo 部分?尝试一次解决其中一项挑战。你的装饰器看起来不错,除非我在那里遗漏了一些东西——我没有尝试运行代码。

祝你好运!

乌里

于 2013-01-12T09:15:46.207 回答
0

以下代码工作正常。感谢那些以有帮助的方式回答的人。

!/usr/bin/python

导入操作系统

导入系统

def 验证(fn):

def wrapper():

    euid = os.geteuid()

    if euid != 0:

        print "This command requires privliged mode. Enter password.."

        os.execvp("sudo", ["sudo"] + sys.argv)

    fn()

return wrapper

@认证

定义显示文件():

dir = raw_input("Please enter a directory name\t")

files = [f for f in os.listdir(dir)]

for file in files:

    if os.path.isfile(file):

        print file

显示文件()

于 2013-01-13T08:33:03.067 回答