通过Python子进程启动Minecraft不起作用

时间:2014-09-21 15:40:13

标签: java python windows cmd minecraft

今天我尝试通过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创建一个小型的Minecraft启动器(小gui等等),我知道我可以用子进程和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中才会出现问题。好吧,经过一番思考后,我意识到我可以“管道”#34; 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,但必须有办法解决问题。 你有什么想法吗?

此致 Jonniboy

2 个答案:

答案 0 :(得分:0)

您可以尝试通过将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

答案 1 :(得分:0)

我做了一点解决方法。很久以前,这是我凌乱的解决方法:

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

不要安全地知道,但我认为shell=True扩展名没有用。