通过命令行从python调用java程序时出现奇怪错误
作为我基于python的程序的一部分,我必须调用一个Java程序——用os.system()完美地解决了这个问题。它工作得很好,直到我把整个东西从一个目录移到另一个目录。我更改了python代码中的所有文件路径,java程序——据我所知,我并不真正理解java——依赖于相对文件路径,而这些路径在移动过程中没有更改。但是现在,java程序无法打开。命令行出现后几乎立即消失,因此我知道os.system()正在工作。这一定与我在os.system中使用的文件路径有关,因为当我将其更改回原始文件路径时,它会再次正常工作。代码如下:通过命令行从python调用java程序时出现奇怪错误,java,python,command-line,Java,Python,Command Line,作为我基于python的程序的一部分,我必须调用一个Java程序——用os.system()完美地解决了这个问题。它工作得很好,直到我把整个东西从一个目录移到另一个目录。我更改了python代码中的所有文件路径,java程序——据我所知,我并不真正理解java——依赖于相对文件路径,而这些路径在移动过程中没有更改。但是现在,java程序无法打开。命令行出现后几乎立即消失,因此我知道os.system()正在工作。这一定与我在os.system中使用的文件路径有关,因为当我将其更改回原始文件路径时
os.system("java -jar C:\\Documents and Settings\\enginx_mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames)
其中fileNames是一个变量,作为参数传递给java程序,我很确定这不是问题所在。如果我直接从cmd.exe调用python程序,那么它会返回错误消息“无法访问文件C:\Documents”。我认为这可能与文件路径中的空格有关,因此我在其中添加了下划线:
os.system("java -jar C:\\Documents_and_Settings\\enginx_mgr.ISIS\\My_Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames)
它给了我同样的“无法访问Jarfile”消息,但这次是完整的文件路径。在文件路径上尝试os.path.exists();我想一定是命令行不同意,但我不知道为什么。有什么想法吗
编辑:如果感兴趣的话,原始文件路径是C:\Inetpub\ftproot\JPivSource\jpivc.jar
编辑2:这几乎肯定不是文件路径,根据下面的答案和它们都不起作用的事实(以及原始文件路径起作用)。凭直觉检查了安全选项,我可以完全控制.jar文件,系统也是如此,所以它并不是因为安全原因而不能访问它。还是零平方 您的问题似乎是由于某个地方的打字错误造成的。这应该可以解决这个问题:
- 打开Windows资源管理器
- 右键单击该文件
- 单击“属性”
- 复制位置
- 将该位置粘贴到脚本中,并转义目录李>
不是直接回答,而是
我认为最好调用
.bat
文件,而不是使用许多命令行选项直接调用java。这样,您就不需要更改Python程序来添加一些其他选项(如-Xms2048m
或-Dfile.encoding=utf8
)
这样的.bat
文件也更容易调试。您必须在路径周围加引号
os.system('java-jar“C:\\Documents and Settings\\engx\u mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar“%s”%filename)
很抱歉,我提供了另一个文件路径解决方案,但没有提到这一点,而且似乎路径的更改可能会导致这个问题。那么,如果你不介意逗我的话
os.system("java -jar C:\\Documents\ and\ Settings\\enginx_mgr.ISIS\\My\ Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames)
我所做的一切都不同,就是用反斜杠逃离空格
您说过,os.path.exists
正在返回True
,这很好,但是您试图通过向命令行程序传递一些参数来执行它。由于空格的原因,读取参数的程序将把字符串解释为多个字符串
您还可以尝试更改正在使用的引号:
os.system('java -jar "C:\\Documents and Settings\\enginx_mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar" %s' % fileNames)
您正在使用的文件路径看起来确实很奇怪。您不应该在路径中使用反斜杠。正斜杠适用于所有系统,而反斜杠仅适用于windows。除此之外,subprocess
还有一些很好的函数,通过数组获取命令和参数,这样您就不必使用引用等。我非常怀疑您的两条路径是否相同。这里有一个类似的问题:您的意思是您实际上重命名了系统上的“文档和设置”吗?还是你只是在通话中用u而不是空格?我建议尝试将jar的名称放在转义引号中:“java-jar\”到jar\%s的路径;该程序只在Windows上使用,出于某些原因,它不喜欢正斜杠。不要问我为什么,我不知道,但是如果我使用正斜杠,程序的另一部分会给我错误消息。另外,subprocess
不是最好的解决方案,对于这个程序,我确实尝试过,但它无法正确发送变量文件名。@Cularis;看到了,尝试了一些解决方案后,仍然会出现“无法访问”错误,这与任何其他解决方案都不同。可能不是文件路径,但如果不是,我不知道是什么导致了它@节点体;第二个。您的解决方案与cularis类似,但仍然不起作用。这绝对不是打字错误。我开始认为这实际上不是导致错误的文件路径,但我不知道它是什么。