【问题标题】:Run selected lines of a Python Script on CMD在 CMD 上运行 Python 脚本的选定行
【发布时间】:2018-02-22 15:56:21
【问题描述】:

我正在使用 cmd 执行 python 脚本,并且在使用其他接口时遇到了挑战,因此只能在 CMD 上执行。 python脚本有113行代码。我想在执行完整脚本之前运行和测试一些选定的子集代码行,而不是从父脚本创建新的 python 脚本。

从下面的例子(有 28 行):

要运行我们在 cmd 中说的父脚本:

C:\Users\X> python myMasterDummyScript.py

我们可以在第 1 - 16 行之间运行吗

虚拟示例:

import numpy as np
from six.moves import range
from six.moves import cPickle as pickle


pickle_file = "C:\\A.pickle"

with open(pickle_file, 'rb') as f:
    data = pickle.load(f, encoding ='latin1')

train_dataset = data['train_dataset']
test_dataset = data['test_dataset']
valid_dataset = data['valid_dataset']
train_labels = data['train_labels']
test_labels = data['test_labels']
valid_labels = data['valid_labels']

a = 28
b = 1

def reformat(dataset, labels):
    dataset = dataset.reshape(-1, a, a, b).astype(np.float32)
    labels = (np.arange(10)==labels[:,None]).astype(np.float32)
    return dataset, labels

train_dataset, train_labels = reformat(train_dataset, train_labels)
test_dataset, test_labels = reformat(test_dataset, test_labels)
valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)

【问题讨论】:

标签: python python-3.x cmd


【解决方案1】:

在 PyCharm 等解释器中打开父脚本并选择要执行的行,然后右键单击 -> 在控制台中执行选择。

【讨论】:

    【解决方案2】:

    理论上可以通过一些工作来实现,但是请注意,脚本通常不是这样工作的。相反,您应该考虑将连贯的例程序列分组到命名函数中,并从命令行调用它们。

    除其他问题外,每次移动行号时,您都必须修改脚本的所有调用代码,您必须重复任何子部分可能需要的任何导入,这通常不是一个好主意。在我提出重构的理由后,我仍然会解决它......

    重构脚本并调用特定函数

    考虑Python: Run function from the command line的这个答案

    你的 python 脚本:

    import numpy as np
    from six.moves import range
    from six.moves import cPickle as pickle
    
    def load_data()
        pickle_file = "C:\\A.pickle"
    
        with open(pickle_file, 'rb') as f:
            data = pickle.load(f, encoding ='latin1')
    
        train_dataset = data['train_dataset']
        test_dataset = data['test_dataset']
        valid_dataset = data['valid_dataset']
        train_labels = data['train_labels']
        test_labels = data['test_labels']
        valid_labels = data['valid_labels']
    
    def main():
        a = 28
        b = 1
    
        def reformat(dataset, labels):
            dataset = dataset.reshape(-1, a, a, b).astype(np.float32)
            labels = (np.arange(10)==labels[:,None]).astype(np.float32)
            return dataset, labels
    
        train_dataset, train_labels = reformat(train_dataset, train_labels)
        test_dataset, test_labels = reformat(test_dataset, test_labels)
        valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)
    

    您的 cmd 代码如下所示:

    REM
    REM any logic to identify which function to call
    REM
    
    python -c "import myMasterDummyScript; myMasterDummyScript.load_data()"
    

    它还使您能够将参数从 cmd 传递到函数调用中。

    现在,如果您真的坚持要从整个 python 脚本中运行任意行子集...

    如何在 cmd 中运行脚本中的特定行

    cmd 从原始脚本中读取这些行并将它们写入临时脚本 查看batch script - read line by line 的建议答案。在没有太多错误管理的情况下稍微调整它(这会大大膨胀这个答案):

    @echo off
    @enabledelayedexpansion
    
    SET startline=$1
    SET endline=$2
    SET originalscript=$3
    
    SET tempscript=tempscript.py
    SET line=1
    
    REM erase tempscript
    echo. > %tempscript%
    
    for /f "tokens=*" %%a in (%originalscript%) do (
      if %line% GEQ %startline% (
          if %line% LEQ %endline% (
              echo %%a >> %tempscript%
          )
      )
      set /a line+=1
    )
    
    python %tempscript%
    pause
    

    你可以这样称呼它:

    C:\> runlines.cmd 1 16 myMasterDummyScript.py
    

    【讨论】:

      【解决方案3】:

      您可以使用命令行调试器pdb。例如,给定以下脚本:

      print('1')
      print('2')
      print('3')
      print('4')
      print('5')
      print('6')
      print('7')
      print('8')
      print('9')
      print('10')
      print('11')
      print('12')
      print('13')
      print('14')
      print('15')
      

      这是一个调试会话,通过跳转到第 5 行、在第 10 行设置断点、提供查看要执行的当前行和断点的列表,然后继续运行行 5-9执行。输入 help 以查看所有可用的命令。

      C:\>py -m pdb test.py
      > c:\test.py(1)<module>()
      -> print('1')
      (Pdb) jump 5
      > c:\test.py(5)<module>()
      -> print('5')
      (Pdb) b 10
      Breakpoint 1 at c:\test.py:10
      (Pdb) longlist
        1     print('1')
        2     print('2')
        3     print('3')
        4     print('4')
        5  -> print('5')
        6     print('6')
        7     print('7')
        8     print('8')
        9     print('9')
       10 B   print('10')
       11     print('11')
       12     print('12')
       13     print('13')
       14     print('14')
       15     print('15')
      (Pdb) cont
      5
      6
      7
      8
      9
      > c:\test.py(10)<module>()
      -> print('10')
      (Pdb)
      

      【讨论】:

      • 出于兴趣,怎么从cmd调用这个?
      • @AntoineM。这是演示的第一行py -m pdb test.py
      • 我得到了这么多,但您仍然需要交互式推送调试器来运行所需的行,不是吗?
      • @AntoineM。是的,但是如果.pdbrc 文件位于用户的主目录或当前目录中,那么如果您想自动化它,命令将自动从该脚本运行。
      【解决方案4】:

      选项 1 - 您可以使用调试器在代码执行的任何时刻了解所有内容。 (python -m pdb myscript.py 也调试你的代码)

      选项 2 - 您可以使用您的脚本创建一个主文件和一个子文件,并在主脚本中导入并执行主文件或任何单独的文件进行测试

      选项 3 - 您可以使用参数 (Using the argparse for example)

      目前我没有更多选择

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-24
        • 2021-12-06
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多