使用子流程模块执行python脚本但代码从空闲状态执行时发生NameError

使用子流程模块执行python脚本但代码从空闲状态执行时发生NameError,python,cmd,subprocess,nameerror,Python,Cmd,Subprocess,Nameerror,我最近使用了subprocess模块及其run方法,仅通过python执行os命令并获得输出 所以当我写一个命令作为输入时,我把它从空格中分割出来,例如 输入:python test.py 输出:['python','test.py']即[cmd,arg1,arg2,…] 现在,当我将其解析为: {'name' : 'python', 'args' = 'test.py'} # i.e. {'name': cmd, 'args': concat_str_of_args} 现在,当我使用它执行测

我最近使用了subprocess模块及其run方法,仅通过python执行os命令并获得输出

所以当我写一个命令作为输入时,我把它从空格中分割出来,例如

输入:python test.py

输出:['python','test.py']即[cmd,arg1,arg2,…]

现在,当我将其解析为:

{'name' : 'python', 'args' = 'test.py'} # i.e. {'name': cmd, 'args': concat_str_of_args}
现在,当我使用它执行测试python脚本时:

# CODE FOR TEST FILE
print('This is a special test for the terminal cmd integration!')
通过空闲执行此文件,我可以无误地获得所需的输出:

这是星际终端cmd集成的特殊测试

当我对运行这个test.py的特殊子流程python脚本执行相同操作时,它会给出一个名称错误:

我无法正确理解相同的原因执行脚本的代码有点像这样:

os.environ["PYTHONUNBUFFERED"] = "1"
print('BLAHDEHDEUFUFH', [command_output['args'][0]], ' '.join(command_output['args'][1 : ]), ' '.join(command_output['args'][1 : ]).encode('utf-8'), 'FI4IFJ4IUFH4UFH4F')
result = subprocess.run([command_output['args'][0]], input = ' '.join(command_output['args'][1 : ]).encode('utf-8'), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell = True, env = os.environ, cwd = 'C:')
这里的print语句是用于调试的,我试图解决这个问题,但没有成功

BLAHDEHDEUFUFH ['python'] test.py b'test.py' FI4IFJ4IUFH4UFH4F
在这里,命令_output['args']的格式如下: [cmd、arg1、arg2….]

我运行此test.py的特殊子流程python脚本它给出了一个名称错误:

来自聊天讨论的您的mre:

import subprocess

command_output = {'args':['python',r'test.py'] }
result = subprocess.run([command_output['args'][0]],
                        input = ' '.join(command_output['args'][1 : ]).encode('utf-8'),
                        stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT,
                        shell = True, env = os.environ, cwd = 'C:')
包括文件的完整路径以减轻名称错误:未定义名称“test\”异常\r\n

command_output = {'args':['python',r'c:\full\path\test.py'] }
对于以下解决方案,您需要适当地解析命令输出

这个表格有效

args = ['python', '-m', 'test']
other = subprocess.run([args,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT,
                        shell = True, env = os.environ, cwd = 'C:')
使用input关键字参数,您需要发送从python shell键入/执行时将使用的python命令

args = [b'python']
cmd = b'import test'
another = subprocess.run(args,
                         input = cmd,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT,
                         shell = True, env = os.environ, cwd = 'C:')
这是一个礼貌的回答。同样,您可能需要包含文件的完整路径

args = [b'python']
cmd = b'''exec(open("test.py").read())'''
another1 = subprocess.run(args,
                         input = cmd,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT,
                         shell = True, env = os.environ, cwd = 'C:')

请不要发布代码、数据或回溯的图像。复制并粘贴为文本,然后将其格式化为代码选择它并键入ctrl-k。。。请将完整的test.py包含在您的文档中。或者足够了,我们可以复制粘贴到编辑器中并复制您的结果。实际上,我会粘贴回溯,但这是我制作的一个gui,它的输出显示文本在tkinter列表框中的显示位置,并且不可选择。此外,还提供了完整的test.py代码。这里仅提供了1行代码,感谢您提供的信息关于发布回溯的正确方式,我下次发布问题时一定会记住。不幸的是,这里的回溯不能完全从gui元素复制,因此我提供了一个屏幕截图only@MatrixProgrammer-见编辑.Thx,我现在让它工作了,我猜是cwd命令不起作用,当前的工作目录没有改变,因此它拾取了一个本地文件,而不是C:drive中的文件,尽管将cwd arg传递为C:!ThxNow,如果你认为这个问题是可以理解的,并且对其他有需要的人有用,请投票赞成重新开始这个问题。@MatrixProgrammer:当然。。。但你的问题可能需要更详细的信息——当我阅读你当前的编辑时,我仍然感到困惑,不得不回顾我们的聊天讨论——我的答案是基于这些讨论的。如果可能的话,请随时撤回接受。如果您提出了自己的解决方案: