2011-07-06 29 views
2

作为我的基于python的程序的一部分,我必须调用一个Java程序 - 用os.system()完全解决这个问题。它运行良好,直到我将整个事物从一个目录移到另一个目录。我更改了python代码中的所有文件路径,并且java程序 - 尽我所知,我不太了解java - 依赖于相关文件路径,这些文件路径在移动过程中未被更改。但是现在,java程序不会打开。命令行看起来几乎立即消失,所以我知道os.system()正在工作。它必须与我在os.system中使用的文件路径有关,因为当我将它改回到原始文件路径时,它再次正常工作。代码如下:通过命令行从python调用java程序的奇怪错误

os.system("java -jar C:\\Documents and Settings\\enginx_mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames) 

其中fileNames是一个变量thingie作为参数传递给java程序,我相当肯定不是问题。如果我直接从cmd.exe调用python程序,那么它会让我回到“无法访问Jarfile C:\ Documents”错误消息。我想这可能与在文件路径的空间做的,所以我把下划线在:

os.system("java -jar C:\\Documents_and_Settings\\enginx_mgr.ISIS\\My_Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames) 

它给了我同样的“无法访问jar文件”的消息,但这次完整的文件路径。在文件路径上试着os.path.exists()返回true,所以python知道它是一个真正的文件路径;我想这肯定是命令行不同意它,但我不知道为什么。有任何想法吗?

编辑:原始文件路径,如果感兴趣的,是C:\Inetpub\ftproot\JPivSource\jpivc.jar

编辑2:它几乎可以肯定不是文件路径,通过下面的答案和事实去,他们没有工作(和原来的文件路径作品)。从预感中检查安全选项,并且我完全控制.jar文件,就像系统一样,所以它不是因为安全原因无法访问它。仍然在零平方。

+3

你不应该在路径中使用反斜杠。正斜线适用于所有系统,反斜线适用于Windows。除此之外,'subprocess'有一些很好的功能,通过一个数组获取命令和参数,所以你不需要引用等。 – ThiefMaster

+2

我非常怀疑你的两条路径是相同的。这里有一个类似的问题:http://stackoverflow.com/questions/204017/how-do-i-execute-a-program-from-python-os-system-fails-due-to-spaces-in-path – Jacob

+0

你的意思是你实际上在你的系统上重命名为“文档和设置”?或者你是否只在电话中放置了_而不是空格?我建议尝试将jar的名称放在转义引号中:“java -jar \”指向jar \“%s”的路径。 – Nodebody

回答

0

您的问题看起来是由于某处出现拼写错误而导致的。这应该可以解决它:

  • 打开Windows资源管理器
  • 在文件上点击右键
  • 单击“属性”
  • 粘贴复制到该位置定位到你的脚本,使用目录逃脱。
+0

它绝对不是一个错字。我开始认为它实际上不是导致错误的文件路径,但是我不知道它是什么。 –

1

不是一个直接的答案,但...

我觉得这是更好地拨打.bat文件,而不是直接调用许多命令行选项为Java。这样你就不需要改变Python程序来添加一些其他选项(如-Xms2048m-Dfile.encoding=utf8)。

这样的.bat文件也比较容易调试。

0

你必须把你的路径引号。

os.system('java -jar "C:\\Documents and Settings\\enginx_mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar" %s' % fileNames)

0

我为提供了另一个文件路径的解决方案很抱歉,但是这并没有提及,而且它很可能是路径的变化会造成问题。所以,如果你不介意羞辱我?

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) 

您正在使用的文件路径看起来很奇怪。