执行脚本时没有任何反应?

Posted

技术标签:

【中文标题】执行脚本时没有任何反应?【英文标题】:While executing script nothing happens? 【发布时间】:2019-11-20 02:22:13 【问题描述】:

我的目标是创建一个 python 脚本,它将格式化/修改 xml 文件。 文件路径和文件名将在命令行中作为参数给出。

下面是我的代码:

import lxml.etree as etree
from argparse import ArgumentParser
import sys
import os

def main():
    parser = ArgumentParser()
    parser.add_argument('-p', '--path', help="path to file's directory", required=True)
    parser.add_argument('-f', '--file', help="file name", required=True)
    args = parser.parse_args()

    root_dir = sys.argv[1]
    file_name = sys.argv[2]

    path = sys.argv[1] + sys.argv[2]

    for dirpath, dirnames, files in os.walk(root_dir):
        for file in files:
            if file == file_name:
                print(os.path.join(dirpath, file_name))

                with open(path, 'r', encoding="utf8") as myfile:
                    try:
                        print("DONE")
                        parser = etree.XMLParser(remove_blank_text = True)
                        tree = etree.parse(path, parser)
                        tree.write(path, pretty_print = True)

                    except IOError:
                        print("IO Exception Occured")

if __name__ == "__main__":
    main()

当我从 cmd 运行它时 - 我有 0 个错误,但文件未格式化,即使我给出的文件名不存在 - 仍然没有错误。所以当我从 cmd 运行它时 - 没有任何反应。

当我尝试在 Visual Studio 中调试它时,出现需要提供 2 个参数的错误。 谁能告诉我如何修复我的代码,我不知道我哪里有错误的代码?

【问题讨论】:

当我从命令行运行时:error: the following arguments are required: -p/--path, -f/--file 你用参数运行它吗? 你应该得到一个错误!你是如何运行它的?如果您从命令行运行,您可以使用python debugger 设置断点并从命令行调试它。否则,在 Visual Studio 中,您可以按照 here 的说明转到 Properties--> Debug 来传递参数。也许这可以帮助调试它.. 带/不带。同样的错误。向我们展示你是如何运行它的。我的猜测是你误用了 ArgumentParser (我很熟悉,但从未真正使用过这个库,所以我在这里可能会弄错) 我认为您正在同时做两件事。首先,您将命令行参数解析为 ArgumentParser(因此它们将位于 args.file 和 args.path 中),但随后您正在阅读 sys.argv[1] 和 sys.argv[2] 并且不再使用 args。您应该选择读取参数的两种方法之一! 【参考方案1】:

您误用/组合/混淆了sys.argvArgumentParser。这段代码实际上给了你意想不到的结果,因为你的变量不是你想象的那样!

root_dir = sys.argv[1]
file_name = sys.argv[2]
# Add some print statements to examine these variables:
print(f'root_dir:root_dir')
print(f'file_name:file_name')

看:

改为这样做:

    root_dir = args.path
    file_name = args.file

这是我用来测试的代码:

from argparse import ArgumentParser
import sys

def main():
    parser = ArgumentParser()
    parser.add_argument('-p', '--path', help="path to file's directory", required=True)
    parser.add_argument('-f', '--file', help="file name", required=True)
    args = parser.parse_args()

    root_dir = args.path
    file_name = args.file
    print(f'root_dir:root_dir')
    print(f'file_name:file_name')

if __name__ == "__main__":
    main()

【讨论】:

是的,我在阅读帖子下的 cmets 后完成了它,现在它可以工作了。谢谢。【参考方案2】:

你把两种东西混在一起了!

方法一

使用XmlFormat.py -p c:\User\Desktop\test\ -f test.xml启动

import lxml.etree as etree
from argparse import ArgumentParser
import sys
import os

def main():
    parser = ArgumentParser()
    parser.add_argument('-p', '--path', help="path to file's directory", required=True)
    parser.add_argument('-f', '--file', help="file name", required=True)
    args = parser.parse_args()

    root_dir = args.path
    file_name = args.file

    path = root_dir + file_name

    for dirpath, dirnames, files in os.walk(root_dir):
        for file in files:
            if file == file_name:
                print(os.path.join(dirpath, file_name))

                with open(path, 'r', encoding="utf8") as myfile:
                    try:
                        print("DONE")
                        parser = etree.XMLParser(remove_blank_text = True)
                        tree = etree.parse(path, parser)
                        tree.write(path, pretty_print = True)

                    except IOError:
                        print("IO Exception Occured")

if __name__ == "__main__":
    main()

方法2

使用XmlFormat.py c:\User\Desktop\test\ test.xml 启动(不要使用-p 和-f)

import lxml.etree as etree
from argparse import ArgumentParser
import sys
import os

def main():
    root_dir = sys.argv[1]
    file_name = sys.argv[2]

    path = root_dir + file_name

    for dirpath, dirnames, files in os.walk(root_dir):
        for file in files:
            if file == file_name:
                print(os.path.join(dirpath, file_name))

                with open(path, 'r', encoding="utf8") as myfile:
                    try:
                        print("DONE")
                        parser = etree.XMLParser(remove_blank_text = True)
                        tree = etree.parse(path, parser)
                        tree.write(path, pretty_print = True)

                    except IOError:
                        print("IO Exception Occured")

if __name__ == "__main__":
    main()

【讨论】:

以上是关于执行脚本时没有任何反应?的主要内容,如果未能解决你的问题,请参考以下文章

Powershell 脚本不通过计划任务运行

运行 .sh 脚本而不是可执行文件

windows11执行python没有任何反应或拉起应用商店的解决办法

windows11执行python没有任何反应或拉起应用商店的解决办法

如何在 PowerShell 中运行 SQL Plus 脚本

命令阶段脚本执行失败,退出代码为非零,反应原生 IOS