【问题标题】:Python Function: using a batch file to pass parameters from .txt file to python function and execute functionPython函数:使用批处理文件将参数从.txt文件传递给python函数并执行函数
【发布时间】:2019-04-11 09:34:55
【问题描述】:

我想使用批处理文件将文本文件中的 1 个或多个参数传递给 python 函数。这可能吗?理想情况下,我想从文本文件中的一行中读取,该行会将特定的 com 端口传递给 python 函数 my_function,这些操作可以使用批处理文件来完成

我目前可以使用批处理文件调用 python 脚本,如下所示。另外,我还可以调用 python 函数并使用 Python Shell 将参数传递给它。我需要能够将文本文件中的不同值传递给我卡住的同一个函数。

任何帮助将不胜感激。

当前批处理文件代码调用 python 脚本

echo[
@echo. The Step below calls the script which opens COM 12
echo[

"C:\Python\python.exe" "C:\Scripts\open_COM12.py"

当前python代码传递参数(com端口号)并调用python函数

import ConfigComPort as cw
from ConfigComPort import my_function
my_function('12')

连接成功

文本文件内容

COM_PORTS
12
19
23
22

【问题讨论】:

    标签: python python-3.x function batch-file parameters


    【解决方案1】:

    如果您有一个名为 parameters.txt 的文件,其中包含数据

    foo
    bar
    foobar
    

    还有一个函数

    def my_function(some_text):
        print("I was called with " + some_text)
    

    然后你可以这样做将文件的每一行传递给函数:

    with open('parameters.txt', 'r') as my_file:
        for line in my_file:
            # remove the # and space from the next line to enable output to console:
            # print(line.rstrip())
    
            my_function(line.rstrip())
    

    请注意,我所有示例中的 rstrip() 方法都会去除尾随换行符(以及其他尾随空格),否则它们会成为每行的一部分。

    如果你的参数文件有一个标题,就像你的例子一样,你有多种可能跳过它。

    例如,您可以一次将所有行读入一个列表,然后遍历一个子集:

    with open('parameters.txt', 'r') as my_file:
        all_lines = [line.rstrip() for line in my_file.readlines()]
    
    # print(all_lines)
    
    for line in all_lines[1:]:
        # print(line)
    
        my_function(line)
    

    但是,这只会忽略标题。如果您不小心传递了错误的文件或包含无效内容的文件,这可能会带来麻烦。

    最好检查一下文件头是否正确。您可以从上面展开代码:

    with open('parameters.txt', 'r') as my_file:
        all_lines = [line.rstrip() for line in my_file.readlines()]
    
    # print(all_lines)
    
    if all_lines[0] != 'COM_PORTS':
        raise RuntimeError("file has wrong header")
    
    for line in all_lines[1:]:
        # print(line)
    
        my_function(line)
    

    或者您可以在循环中执行此操作,例如:

    expect_header = True
    
    with open('parameters.txt', 'r') as my_file:
        for line in my_file:
            stripped = line.rstrip()
            if expect_header:
                if stripped != 'COM_PORTS':
                    raise RuntimeError("header of file is wrong")
    
                expect_header = False
                continue
    
            # print(stripped)
    
            my_function(stripped)
    

    或者您可以使用生成器表达式来检查循环外的标头:

    with open('parameters.txt', 'r') as my_file:
        all_lines = (line.rstrip() for line in my_file.readlines())
    
    if next(all_lines) != 'COM_PORTS':
        raise RuntimeError("file has wrong header")
    
    for line in all_lines:
        # print(line)
    
        my_function(line)
    

    我可能更喜欢最后一个,因为它结构清晰,没有神奇的数字(例如01,分别指哪一行是标题以及要跳过多少行),而且它不需要一次将所有行读入内存。

    但是,如果您想对它们进行进一步处理,那么上述将所有行一次读入列表的解决方案可能会更好,因为在这种情况下数据已经可用并且您不需要再次读取文件.

    【讨论】:

    • 感谢您的详细回复。关于前几个代码 sn-ps,我有几个问题。我假设代码知道在默认位置查找 parameters.txt 文件?我的位置是 C:\Python。另外,如何确认函数已经读取了参数文件的内容?
    • 如果您没有明确指定访问文件的目录,它将在所谓的“当前目录”或“工作目录”中查找。这可以在任何地方。在命令行上,您可以执行C: 然后cd \some\place 来更改当前驱动器和目录。然后这是脚本从中获取文件的地方。如果您通过单击快捷方式(即桌面或开始菜单上的图标)来启动它,您可以在快捷方式属性中更改工作目录。当然,您也可以更改我的示例以包含文件的完整路径。 open('C:\\some\\where\\file.txt', 'r')
    • 确认你的意思是你想打印调试行?在所有示例中,如果不中断,这将无法正常工作。唯一可以的是将所有行读入列表的两个。你可以在那里做print(all_lines)。第一个和最后两个示例不容易这样工作,因为它们“在旅途中”消耗文件的行。谁先吃,谁先吃,谁吃,谁吃都没有。在这些情况下,您必须再次读取文件或使用itertools.tee() 才能使用它们两次。
    • 但是,在所有示例中,您还可以打印出每一行,因为它将与函数调用一起处理。只需在my_function(foo) 调用上方酌情添加print(line)print(stripped)
    • 我在代码中添加了一些 cmets,以向您展示可以在哪里添加调试 print()s。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2015-12-19
    • 2019-01-04
    • 2020-03-28
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多