Во время выполнения скрипта ничего не происходит? - PullRequest
2 голосов
/ 10 июля 2019

Моя цель - создать скрипт на 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 аргумента. Кто-нибудь может сказать мне, как исправить мой код, я понятия не имею, где у меня неправильный код?

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Вы неправильно используете / комбинируете / путаете sys.argv и ArgumentParser.Этот код фактически дает вам неожиданный результат, потому что ваши переменные не такие, как вы думаете!

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}')

Взгляд:

enter image description here

Сделайте это вместо:

    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()
1 голос
/ 10 июля 2019

Вы смешиваете две вещи!

МЕТОД 1

Запуск с 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...