我正在使用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)
答案 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从原始脚本中读取这些行并将它们写入临时脚本 查看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)
我目前没有更多选择