【问题标题】:Launching Minecraft via Python subprocess doesn't work通过 Python 子进程启动 Minecraft 不起作用
【发布时间】:2014-09-21 15:40:12
【问题描述】:

今天我尝试在 Windows 7 上通过命令行启动 Minecraft 客户端。它可以工作!使用此代码:

java -Xmx1024M -Djava.library.path="%APPDATA%\.minecraft\versions\1.7.10\1.7.10-natives" -cp "%APPDATA%\.minecraft\libraries\org\apache\logging\log4j\log4j-api\2.0-beta9\log4j-api-2.0-beta9.jar;%APPDATA%\.minecraft\libraries\org\apache\logging\log4j\log4j-core\2.0-beta9\log4j-core-2.0-beta9.jar;%APPDATA%\.minecraft\libraries\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;%APPDATA%\.minecraft\libraries\com\mojang\authlib\1.3\authlib-1.3.jar;%APPDATA%\.minecraft\libraries\io\netty\netty-all\4.0.10.Final\netty-all-4.0.10.Final.jar;%APPDATA%\.minecraft\libraries\java3d\vecmath\1.3.1\vecmath-1.3.1.jar;%APPDATA%\.minecraft\libraries\net\sf\trove4j\trove4j\3.0.3\trove4j-3.0.3.jar;%APPDATA%\.minecraft\libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-simple-4.5.jar;%APPDATA%\.minecraft\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;%APPDATA%\.minecraft\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;%APPDATA%\.minecraft\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;%APPDATA%\.minecraft\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;%APPDATA%\.minecraft\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;%APPDATA%\.minecraft\libraries\com\google\guava\guava\15.0\guava-15.0.jar;%APPDATA%\.minecraft\libraries\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar;%APPDATA%\.minecraft\libraries\commons-io\commons-io\2.4\commons-io-2.4.jar;%APPDATA%\.minecraft\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;%APPDATA%\.minecraft\libraries\net\java\jinput\jinput-platform\2.0.5\jinput-platform-2.0.5-natives-windows.jar;%APPDATA%\.minecraft\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;%APPDATA%\.minecraft\libraries\com\google\code\gson\gson\2.2.4\gson-2.2.4.jar;%APPDATA%\.minecraft\libraries\org\lwjgl\lwjgl\lwjgl\2.9.0\lwjgl-2.9.0.jar;%APPDATA%\.minecraft\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.0\lwjgl_util-2.9.0.jar;%APPDATA%\.minecraft\versions\1.7.10\1.7.10.jar" net.minecraft.client.main.Main --username [username] --version 1.7.10 --gameDir C:\Users\Jon\AppData\Roaming\.minec~1 --assetsDir C:\Users\Jon\AppData\Roaming\.minec~1\assets --accessToken [accessToken] --uuid [uuid] --userProperties {} --userType mojang

有点长,但如果你设置了用户名、uuid 和 accessToken 就可以了。

现在我想用 Python(小 gui 等)创建一个小的 Minecraft 启动器,我知道我可以用 subprocess 和 Popen 调用命令。

所以我尝试了 Popen:

import subprocess

# sc = start command
sc = ['java', '-Xmx1024M', '-Djava.library.path="%APPDATA%\\.minecraft\\versions\\1.7.10\\1.7.10-natives"', '-cp', '"%APPDATA%\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-api\\2.0-beta9\\log4j-api-2.0-beta9.jar;%APPDATA%\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-core\\2.0-beta9\\log4j-core-2.0-beta9.jar;%APPDATA%\\.minecraft\\libraries\\com\\ibm\\icu\\icu4j-core-mojang\\51.2\\icu4j-core-mojang-51.2.jar;%APPDATA%\\.minecraft\\libraries\\com\\mojang\\authlib\\1.3\\authlib-1.3.jar;%APPDATA%\\.minecraft\\libraries\\io\\netty\\netty-all\\4.0.10.Final\\netty-all-4.0.10.Final.jar;%APPDATA%\\.minecraft\\libraries\\java3d\\vecmath\\1.3.1\\vecmath-1.3.1.jar;%APPDATA%\\.minecraft\\libraries\\net\\sf\\trove4j\\trove4j\\3.0.3\\trove4j-3.0.3.jar;%APPDATA%\\.minecraft\\libraries\\net\\sf\\jopt-simple\\jopt-simple\\4.5\\jopt-simple-4.5.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\codecjorbis\\20101023\\codecjorbis-20101023.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\codecwav\\20101023\\codecwav-20101023.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\librarylwjglopenal\\20100824\\librarylwjglopenal-20100824.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\libraryjavasound\\20101123\\libraryjavasound-20101123.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\soundsystem\\20120107\\soundsystem-20120107.jar;%APPDATA%\\.minecraft\\libraries\\com\\google\\guava\\guava\\15.0\\guava-15.0.jar;%APPDATA%\\.minecraft\\libraries\\org\\apache\\commons\\commons-lang3\\3.1\\commons-lang3-3.1.jar;%APPDATA%\\.minecraft\\libraries\\commons-io\\commons-io\\2.4\\commons-io-2.4.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jinput\\jinput\\2.0.5\\jinput-2.0.5.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jinput\\jinput-platform\\2.0.5\\jinput-platform-2.0.5-natives-windows.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jutils\\jutils\\1.0.0\\jutils-1.0.0.jar;%APPDATA%\\.minecraft\\libraries\\com\\google\\code\\gson\\gson\\2.2.4\\gson-2.2.4.jar;%APPDATA%\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl\\2.9.0\\lwjgl-2.9.0.jar;%APPDATA%\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl_util\\2.9.0\\lwjgl_util-2.9.0.jar;%APPDATA%\\.minecraft\\versions\\1.7.10\\1.7.10.jar"', 'net.minecraft.client.main.Main', '--username', '[username]', '--version', '1.7.10', '--gameDir', 'C:\\Users\\Jon\\AppData\\Roaming\\.minecraft', '--assetsDir C:\\Users\\Jon\\AppData\\Roaming\\.minecraft\\assets', '--accessToken', '[accessToken]', '--uuid', '[uuid]', '--userProperties', '{}', '--userType', 'mojang']
p = subprocess.Popen(sc, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
while True:
o = p.stdout.readline()
e = p.stderr.readline()
if o:
    print o
if e:
    print e
if o or e:
    pass
else:
    break

由于发生错误,它不起作用:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager

    at bao.<clinit>(SourceFile:84)

    at net.minecraft.client.main.Main.main(SourceFile:72)

Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager


    at java.net.URLClassLoader$1.run(Unknown Source)

    at java.net.URLClassLoader$1.run(Unknown Source)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(Unknown Source)

    at java.lang.ClassLoader.loadClass(Unknown Source)

    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

    at java.lang.ClassLoader.loadClass(Unknown Source)

    ... 2 more

在普通命令行中,该命令可以正常工作,没有任何问题,但只有在 Python 中才会出现问题。好的,经过一番思考,我意识到我可以“管道”cmd.exe 和 java 命令 + 参数。

所以我也试过了:

import subprocess

### as you can see, I've tried to replace the %appdata%-placeholder too

# start command
sc = ['java', '-Xmx1024M', '-Djava.library.path="%APPDATA%\\.minecraft\\versions\\1.7.10\\1.7.10-natives"', '-cp', '"%APPDATA%\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-api\\2.0-beta9\\log4j-api-2.0-beta9.jar;%APPDATA%\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-core\\2.0-beta9\\log4j-core-2.0-beta9.jar;%APPDATA%\\.minecraft\\libraries\\com\\ibm\\icu\\icu4j-core-mojang\\51.2\\icu4j-core-mojang-51.2.jar;%APPDATA%\\.minecraft\\libraries\\com\\mojang\\authlib\\1.3\\authlib-1.3.jar;%APPDATA%\\.minecraft\\libraries\\io\\netty\\netty-all\\4.0.10.Final\\netty-all-4.0.10.Final.jar;%APPDATA%\\.minecraft\\libraries\\java3d\\vecmath\\1.3.1\\vecmath-1.3.1.jar;%APPDATA%\\.minecraft\\libraries\\net\\sf\\trove4j\\trove4j\\3.0.3\\trove4j-3.0.3.jar;%APPDATA%\\.minecraft\\libraries\\net\\sf\\jopt-simple\\jopt-simple\\4.5\\jopt-simple-4.5.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\codecjorbis\\20101023\\codecjorbis-20101023.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\codecwav\\20101023\\codecwav-20101023.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\librarylwjglopenal\\20100824\\librarylwjglopenal-20100824.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\libraryjavasound\\20101123\\libraryjavasound-20101123.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\soundsystem\\20120107\\soundsystem-20120107.jar;%APPDATA%\\.minecraft\\libraries\\com\\google\\guava\\guava\\15.0\\guava-15.0.jar;%APPDATA%\\.minecraft\\libraries\\org\\apache\\commons\\commons-lang3\\3.1\\commons-lang3-3.1.jar;%APPDATA%\\.minecraft\\libraries\\commons-io\\commons-io\\2.4\\commons-io-2.4.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jinput\\jinput\\2.0.5\\jinput-2.0.5.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jinput\\jinput-platform\\2.0.5\\jinput-platform-2.0.5-natives-windows.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jutils\\jutils\\1.0.0\\jutils-1.0.0.jar;%APPDATA%\\.minecraft\\libraries\\com\\google\\code\\gson\\gson\\2.2.4\\gson-2.2.4.jar;%APPDATA%\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl\\2.9.0\\lwjgl-2.9.0.jar;%APPDATA%\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl_util\\2.9.0\\lwjgl_util-2.9.0.jar;%APPDATA%\\.minecraft\\versions\\1.7.10\\1.7.10.jar"', 'net.minecraft.client.main.Main', '--username', 'Microskype', '--version', '1.7.10', '--gameDir', 'C:\\Users\\Jon\\AppData\\Roaming\\.minecraft', '--assetsDir C:\\Users\\Jon\\AppData\\Roaming\\.minecraft\\assets', '--accessToken', '40b9d172b3fe4e3486e33a67ca3db075', '--uuid', 'e457b026-2e68-40b6-b38d-fcb3645ba318', '--userProperties', '{}', '--userType', 'mojang']
# new start command starting with cmd.exe and /C to pipe cmd.exe and the java command + parameters
nsc = ["cmd.exe", "/C"]

for one in sc:
    one = one.replace('%APPDATA%', 'C:\\Users\\Jon\\AppData\\Roaming')
    one = one.replace('%appdata%', 'C:\\Users\\Jon\\AppData\\Roaming')
    nsc.append(one)

p = subprocess.Popen(nsc, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
    o = p.stdout.readline()
    e = p.stderr.readline()
    if o:
        print o
    if e:
        print e
    if o or e:
        pass
    else:
        break

然后我尝试使用整个 Java 路径而不是 java,但我得到了WindowsError: [Error 5] Access denied。命令长吗? :D

我认为问题是Windows,但必须有解决问题的方法。 你有什么想法吗?

问候, 强尼男孩

【问题讨论】:

  • Windows 命令行限制为 1024 个字符。
  • @tdelaney 我是这么想的,但是如何在不突破限制的情况下解决问题?
  • 尝试将 -cp 字符串放在 CLASSPATH 环境变量中。 env = os.environ.copy();env['CLASSPATH']="the class path string";Popen(..., env=env).

标签: java python windows cmd minecraft


【解决方案1】:

您能否尝试通过将shell=True 添加到Popen 构造函数来修改您的第一个版本?

import subprocess

# sc = start command
sc = ['java', '-Xmx1024M', '-Djava.library.path="%APPDATA%\\.minecraft\\versions\\1.7.10\\1.7.10-natives"', '-cp', '"%APPDATA%\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-api\\2.0-beta9\\log4j-api-2.0-beta9.jar;%APPDATA%\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-core\\2.0-beta9\\log4j-core-2.0-beta9.jar;%APPDATA%\\.minecraft\\libraries\\com\\ibm\\icu\\icu4j-core-mojang\\51.2\\icu4j-core-mojang-51.2.jar;%APPDATA%\\.minecraft\\libraries\\com\\mojang\\authlib\\1.3\\authlib-1.3.jar;%APPDATA%\\.minecraft\\libraries\\io\\netty\\netty-all\\4.0.10.Final\\netty-all-4.0.10.Final.jar;%APPDATA%\\.minecraft\\libraries\\java3d\\vecmath\\1.3.1\\vecmath-1.3.1.jar;%APPDATA%\\.minecraft\\libraries\\net\\sf\\trove4j\\trove4j\\3.0.3\\trove4j-3.0.3.jar;%APPDATA%\\.minecraft\\libraries\\net\\sf\\jopt-simple\\jopt-simple\\4.5\\jopt-simple-4.5.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\codecjorbis\\20101023\\codecjorbis-20101023.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\codecwav\\20101023\\codecwav-20101023.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\librarylwjglopenal\\20100824\\librarylwjglopenal-20100824.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\libraryjavasound\\20101123\\libraryjavasound-20101123.jar;%APPDATA%\\.minecraft\\libraries\\com\\paulscode\\soundsystem\\20120107\\soundsystem-20120107.jar;%APPDATA%\\.minecraft\\libraries\\com\\google\\guava\\guava\\15.0\\guava-15.0.jar;%APPDATA%\\.minecraft\\libraries\\org\\apache\\commons\\commons-lang3\\3.1\\commons-lang3-3.1.jar;%APPDATA%\\.minecraft\\libraries\\commons-io\\commons-io\\2.4\\commons-io-2.4.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jinput\\jinput\\2.0.5\\jinput-2.0.5.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jinput\\jinput-platform\\2.0.5\\jinput-platform-2.0.5-natives-windows.jar;%APPDATA%\\.minecraft\\libraries\\net\\java\\jutils\\jutils\\1.0.0\\jutils-1.0.0.jar;%APPDATA%\\.minecraft\\libraries\\com\\google\\code\\gson\\gson\\2.2.4\\gson-2.2.4.jar;%APPDATA%\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl\\2.9.0\\lwjgl-2.9.0.jar;%APPDATA%\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl_util\\2.9.0\\lwjgl_util-2.9.0.jar;%APPDATA%\\.minecraft\\versions\\1.7.10\\1.7.10.jar"', 'net.minecraft.client.main.Main', '--username', '[username]', '--version', '1.7.10', '--gameDir', 'C:\\Users\\Jon\\AppData\\Roaming\\.minecraft', '--assetsDir C:\\Users\\Jon\\AppData\\Roaming\\.minecraft\\assets', '--accessToken', '[accessToken]', '--uuid', '[uuid]', '--userProperties', '{}', '--userType', 'mojang']
p = subprocess.Popen(sc, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True)
while True:
    o = p.stdout.readline()
    e = p.stderr.readline()
    if o:
        print o
    if e:
        print e
    if o or e:
        pass
    else:
        break

【讨论】:

    【解决方案2】:

    我做了一些解决方法。这是很久以前的事了,但这是我的混乱解决方法:

    我在一个临时文件夹中使用命令创建了一个 .bat 文件。现在我可以使用长命令版本启动 Minecraft。

    不知道安全,但我认为shell=True 扩展不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2012-05-04
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多