python结合使用ack和tkin

2024-04-24 12:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点卡住了。我想在一个目录中“确认”并在终端中打印确认列表。但是当我尝试运行脚本时,它只在当前目录中。你知道吗

我用tkinter创建tkFileDialog.ask目录()

不过,我还是被卡住了。。你知道吗

有人能帮忙吗?或者指出我做错了什么? 我写的代码如下

foldername = tkFileDialog.askdirectory()

if os.path.isdir(foldername):
        print "\033[1m" + foldername + "\033[0m"
        os.system("ack -i 'password' --ignore-file=is:easyack.py")
else: print "\033[1m" + "No folder chosen" + "\033[0m"

Tags: path代码目录脚本终端列表ifos
2条回答

您需要指示ack子进程在foldername而不是当前目录中运行。你不能用os.system来做这件事,但是你可以用^{}模块,用cwd=参数来Popen或者任何方便的包装器。在这种情况下,subprocess.check_call就是您想要的:

if os.path.isdir(foldername):
    #print "\033[1m" + foldername + "\033[0m"
    sys.stdout.write("\033[1m{}\033[0m\n".format(repr(foldername)[1:-1]))
    #os.system("ack -i 'password'  ignore-file=is:easyack.py")
    subprocess.check_call(
        ["ack", "-i", "password", " ignore-file=is:easyack.py"],
        cwd=foldername)
else:
    #print "\033[1m" + "No folder chosen" + "\033[0m"
    sys.stdout.write("\033[1m{}\033[0m is not a folder\n"
                     .format(repr(foldername)[1:-1]))

我强烈建议你忘记你曾经听说过的os.system,一直使用subprocess。对于非常简单的事情来说,它稍微复杂一些,但是它能够处理比os.system更复杂的事情。你知道吗

两种选择:

  1. 在运行ack之前跳转到目标目录

    origin = os.getcwd()
    if os.path.isdir(foldername):
        os.chdir(foldername)
        print(..., etc.)
    os.chdir(origin)
    

注意:这种方法被一些人认为是一种反模式(参见下面zwol的评论),因为它可能无法返回到原始目录(例如,如果它被删除或者它的权限被更改),并且CHDOS公司影响整个进程,因此可能会中断其他线程中正在进行的工作。你知道吗

  1. 将目标文件夹添加到ack命令

    os.system("ack -i 'password'  ignore-file=is:easyack.py {0}".format(foldername))
    

相关问题 更多 >