我有一个运行python脚本的批处理文件,在python脚本中,我有一个正在运行的子流程函数。
我已经试过subprocess.check_output
,subprocess.run
,subprocess.Popen
,所有的人都返回我使用批处理文件运行,只有当它为空字符串。
如果手动或使用IDE运行它,则可以正确获得响应。以下是代码subprocess.run
:
response = subprocess.run(fileCommand, shell=True, cwd=pSetTableauExeDirectory, capture_output=True)
self.writeInLog(' Command Response: \t' + str(response))
响应在stdout = b中''
在批处理文件中运行并从任务计划程序运行时:
命令响应:CompletedProcess(args ='tableau refreshextract --config-file“ Z:\ XXX \ tableau_config \ SampleSuperStore.txt”',returncode = 0,stdout = b'',stderr = b'')
手动运行或在IDE中运行时:
命令响应:CompletedProcess(args ='tableau refreshextract --config-file“ Z:\ XXX \ tableau_config \ SampleSuperStore.txt”',返回码= 0,stdout = b'数据源刷新已完成。\ r \ n0行已上传。\ r \ n',stderr = b'')
运行python程序的批处理文件。参数解析到python应用程序
SET config=SampleSuperStore.txt
CALL C:\XXX\AppData\Local\Continuum\anaconda3\Scripts\activate.bat
C:\XXX\AppData\Local\Continuum\anaconda3\python.exe Z:\XXX\pMainManual.py "%config%"
这是为什么??
-完整的python代码-
try:
from pWrapper import wrapper
import sys
except Exception as e:
print(str(e))
class main:
def __init__(self):
self.tableauPath = 'C:\\Program Files\\Tableau\\Tableau 2018.3\\bin\\'
self.tableauCommand = 'tableau refreshextract --config-file'
def runJob(self,argv):
self.manual_sProcess(argv[1])
def manual_sProcess(self,tableauConfigFile):
new_wrapper = wrapper()
new_wrapper.tableauSetup(self.tableauPath,self.tableauCommand)
if new_wrapper.tableauConfigExists(tableauConfigFile):
new_wrapper.tableauCommand(tableauConfigFile)
if __name__ == "__main__":
new_main = main()
new_main.runJob(sys.argv)
包装类:
def tableauCommand(self,tableauConfigFile):
command = self.setTableauExeDirectory + ' ' + self.refreshConfigCommand + ' "' + tableauConfigFile + '"'
self.new_automateTableauExtract.runCommand(tableauConfigFile,command,self.refreshConfigCommand,self.tableauFilePath,self.setTableauExeDirectory)
自动化课程:
def runCommand(self,pConfig,pCommand,pRefreshConfigCommand,pFilePath,pSetTableauExeDirectory):
try:
fileCommand = pRefreshConfigCommand + ' "' + pFilePath + '"'
response = subprocess.run(fileCommand, shell=True, cwd=pSetTableauExeDirectory, capture_output=True)
self.writeInLog(' Command Response: \t' + str(response))
except Exception as e:
self.writeInLog('Exception in function runCommand: ' + str(e))
更新:我最初认为bat文件是导致此问题的原因,但是当手动运行批处理文件时似乎可以工作,但是在任务计划程序上设置时却无法运行
首先,如果需要anaconda-prompt
通过调用activate.bat
文件来运行,则只需执行以下操作:
import subprocess
def call_anaconda_venv():
subprocess.call('python -m venv virtual.env')
subprocess.call('cmd.exe /k /path/venv/Scripts/activate.bat')
if __name__ == "__main__":
call_anaconda_venv()
anaconda-prompt
需要。现在,问题似乎像:
我有一个
batch file
正在运行的python脚本,在python脚本中,我有一个subprocess
正在运行的函数。
我已经按照要求实施了相同的程序;假设我们有
批处理文件---> script.bat
****包含运行python脚本的命令,即test.py
。****
Python脚本文件---> test.py
****包括方法使用运行命令subprocess
。****
批处理文件---> sys_info.bat
****包含将提供我的计算机的系统信息的命令。****
现在,首先,script.bat
包含一个将运行所需的python脚本的命令,如下所示;
python \file_path\test.py
pause
在此,pause
命令用于防止执行后自动关闭控制台。现在我们有了test.py
python脚本,其中包括subprocess
运行所需命令并获取其输出的方法。
from subprocess import check_output
class BatchCommands:
@staticmethod
def run_commands_using_subprocess(commands):
print("Running commands from File: {}".format(commands))
value = check_output(commands, shell=True).decode()
return value
@staticmethod
def run():
commands_from_file = "\file-path\sys_info.bat"
print('##############################################################')
print("Shell Commands using >>> subprocess-module <<<")
print('##############################################################')
values = BatchCommands.run_commands_using_subprocess(commands_from_file)
print(values)
if __name__ == '__main__':
BatchCommands.run()
现在,最后,我有了一个sys_info.bat
文件,其中包含用于更新计算机IP地址的命令。sys_info.bat
文件中的命令如下;
systeminfo
将多个命令放在sys_info.bat
文件中,然后您也可以一次运行多个命令,例如:
ipconfig/all
ipconfig/release
ipconfig/reset
ipconfig/renew
ipconfig
之前使用的文件,将所有文件directory paths
,并运行该批处理文件,即script.py
在command-prompt
如下;
将命令提示符或终端运行为administrator
。
run \file_path\script.py
这是在中运行批处理文件后的结果terminal
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句