簡體   English   中英

在CMD上運行Python腳本的選定行

[英]Run selected lines of a Python Script on 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)

在諸如PyCharm的解釋器中打開父腳本,然后選擇要執行的行,然后在控制台中右鍵單擊->執行選擇。

理論上只需做一些工作就可以實現,但是請注意,這通常不是腳本的工作方式。 相反,您應該考慮將連貫的例程序列分組為命名函數,然后從命令行調用它們。

除其他問題外,每次移位行號時,您都必須將所有調用代碼修改為腳本,必須重復任何子節可能需要的任何導入操作,通常這不是一個好主意。 不過,在我提出重構理由之后,我仍然要解決這個問題。

重構腳本並調用特定功能

考慮以下Python答案:從命令行運行函數

您的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將從原始腳本中讀取這些行並將它們寫入臨時腳本。查看批處理腳本的建議答案-逐行讀取 略微調整它,而無需過多的錯誤管理(這將大大膨脹此答案):

@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

您可以使用命令行調試器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行運行第5-9行,在第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)

選項1-您可以在代碼執行的任何時刻使用調試器來了解所有信息。 python -m pdb myscript.py調試代碼)

選項2-您可以使用腳本片段創建一個主文件和一個子文件,然后導入主腳本並執行該主文件或任何單獨的文件進行測試

選項3-您可以使用參數(例如使用argparse)

我目前沒有更多選擇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM