【问题标题】:Strange error calling java program from python via command line通过命令行从python调用java程序的奇怪错误
【发布时间】:2011-07-06 12:04:34
【问题描述】:

作为我基于 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 程序,那么它会返回错误消息“无法访问 Jarfile 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() 会返回true,所以python 知道它是一个真正的文件路径;我想这一定是命令行不同意它,但我不知道为什么。有什么想法吗?

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

编辑 2:几乎可以肯定它不是文件路径,通过下面的答案以及它们都不起作用(并且原始文件路径起作用)的事实。出于预感检查了安全选项,我可以完全控制 .jar 文件,系统也是如此,因此并不是出于安全原因它无法访问它。仍然在零平方。

【问题讨论】:

  • 您不应该在路径中使用反斜杠。正斜杠适用于所有系统,而反斜杠仅适用于 Windows。除此之外,subprocess 有一些不错的函数通过数组获取命令和参数,因此您不必使用引用等。
  • 我非常怀疑您的两条路径是否相同。这是一个类似的问题:stackoverflow.com/questions/204017/…
  • 您的意思是您实际上重命名了系统上的“文档和设置”吗?还是您只是在通话中放了 _ 而不是空格?我建议尝试将 jar 的名称放在转义引号中:"java -jar \"path to jar\" %s"。
  • @ThiefMaster;该程序只能在 Windows 上使用,并且由于某种原因它不喜欢正斜杠。不要问我为什么,我不知道,但是如果我使用正斜杠,我的程序的另一部分会给我错误消息。另外,subprocess 不是最好的解决方案,对于这个程序,我确实尝试过,但它无法正确发送变量 fileNames。
  • @Cularis;看到这一点,尝试了一些解决方案,仍然给我“无法访问”错误,这与任何一个都不同。也许它不是文件路径,但如果不是,我不知道是什么原因造成的。 @节点体;第二个。您的解决方案类似于 cularis',但仍然不起作用。

标签: java python command-line


【解决方案1】:

不是直接回答,而是...

我认为调用.bat 文件而不是使用许多命令行选项直接调用java 更好。这样您就不需要更改 Python 程序来添加一些其他选项(例如 -Xms2048m-Dfile.encoding=utf8)。

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

【讨论】:

    【解决方案2】:

    您的问题似乎是由于某处的拼写错误引起的。这应该可以解决它:

    • 打开 Windows 资源管理器
    • 右键单击文件
    • 点击“属性”
    • 复制位置
    • 将该位置粘贴到您的脚本中,并转义目录。

    【讨论】:

    • 绝对不是错字。我开始认为它实际上不是导致错误的文件路径,但后来我不知道它是什么。
    【解决方案3】:

    你必须在你的路径周围加上引号。

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

    【讨论】:

      【解决方案4】:

      很抱歉提供了另一个文件路径解决方案,但没有提到这一点,而且似乎路径的更改可能会导致问题。所以,如果你不介意取笑我?

      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)
      

      你使用的那个文件路径确实看起来很奇怪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 2015-08-08
        • 2018-12-11
        相关资源
        最近更新 更多