在CMD上运行Python脚本的选定行

时间:2018-02-22 06:54:15

标签: python python-3.x cmd

我正在使用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)

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

重构脚本并调用特定函数

考虑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

答案 2 :(得分:0)

您可以使用命令行调试器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-9行,跳转到第5行,在第10行设置断点,给出一个列表,以查看要执行的当前行和断点,并继续执行。键入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)

答案 3 :(得分:0)

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

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

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

我目前没有更多选择