精华内容
下载资源
问答
  • 启动器全部由本人一人编写完成,作为练手的作品。编写过程磕磕绊绊,大多时间都在查阅各种网上资料。 现在写下这篇文章以供后来者参考。   本启动器预计实现以下内容 启动器预计实现的功能 是否完成 项目...

    启动器全部由本人一人编写完成,作为练手的作品。编写过程磕磕绊绊,大多时间都在查阅各种网上资料。

    现在写下这篇文章以供后来者参考。

     

    本启动器预计实现以下内容

    启动器预计实现的功能
    是否完成项目名称功能简介完成日期
    登录器的打开及退出打开登录器界面及关闭登录器2018/7/10
    登录器GUI布局登录器用户互动界面规划2018/7/10
    注册功能在登陆器上注册游戏账号2018/7/17
     宣传图的更新可以实时获取网站上的最新宣传图数据并更新启动器上的图片 
     公告栏的更新可以实时获取网站上的公告数据并更新到启动器上的公告栏 
     新闻栏的更新可以实时获取网站上的新闻数据并更新到启动器上的新闻栏 
     客户端更新功能比对客户端与服务端的版本号,若不同则进入自动更新 
     客户端绑定功能只有该启动器发起的请求可以进入服务器,否则拒绝 
     商店功能可以在启动器上浏览服务器的商店 
     积分兑换隶属商店功能,使用用户的积分兑换商品 
     充值功能隶属商店功能,可以直接充值商店点数 
     查询功能查询玩家信息(玩家等级、注册时间、最后登录时间等) 
     下载功能提供现行JAVA下载、安装 
    启动器配置JAVA路径、内存等参数2018/7/24
    窗口可拖动按住窗口部位可拖动窗口2018/7/24
    游戏启动直接启动游戏,并实现可以直接进入服务器功能2018/8/1
    ⊕为完成一部分功能

    本篇文章侧重于启动器对游戏的启动过程。若有其他问题。可私信我提问。知无不言。


    作为一个开发白痴。一开始写到启动功能时,两眼一抹黑。

    最开始引用了MCBBS论坛上开源的JMCCC类库

    但是在实际使用中碰到了以下问题。

    AL lib: (EE) alc_cleanup: 1 device not closed
    游戏进程退出,状态码:-1

    四处求助无果后,我开始转向另一种方法。在论坛上看到的解析JSON来启动游戏。于是我参考了HMCL启动器生成的启动脚本

    其生成脚本如下

    @echo off
    set appdata=[游戏根目录]\.minecraft
    "C:\Program Files\Java\jre1.8.0_181\bin\javaw.exe"
     -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
     -XX:+UseG1GC
     -XX:-UseAdaptiveSizePolicy
     -XX:-OmitStackTraceInFastThrow
     -Xmn128m
     -Xmx2048m
     -Djava.library.path=[游戏根目录]\.minecraft\versions\1.12.2\1.12.2-natives
     -Dfml.ignoreInvalidMinecraftCertificates=true
     -Dfml.ignorePatchDiscrepancies=true
     -cp /C:/Users/郑志钦/Desktop/格式工厂输出/3d/HMCL-2.4.1.6.exe org.jackhuang.hellominecraft.launcher.Launcher
     -cp=[游戏根目录]\.minecraft\libraries\com\mojang\patchy\1.1\patchy-1.1.jar;
    。
    。。。。省略一万个支持库路径。。。。
    。
    [游戏根目录]\.minecraft\libraries\com\mojang\text2speech\1.10.3\text2speech-1.10.3.jar;
    [游戏根目录]\.minecraft\versions\1.12.2\1.12.2.jar
     -mainClass=net.minecraft.client.main.Main
     --username need
     --version "HMCL 2.4.1.6"
     --gameDir [游戏根目录]\.minecraft
     --assetsDir [游戏根目录]\.minecraft\assets
     --assetIndex 1.12
     --uuid e877c56e4fb621e81fd30dbd114a545b
     --accessToken e877c56e4fb621e81fd30dbd114a545b
     --userType Legacy
     --versionType "HMCL 2.4.1.6"
     --height 480
     --width 854

    于是按照正常思维,我将其中引用了HMCL类库部分语句删去 却发现无法启动 提示

    多次尝试无果后再次转变思想,打算抛弃已有类库,尝试自己写一个启动核心。

    在论坛发帖求助后(论坛帖)。得知在wiki.vg上有有关启动游戏的资料及看了KMCCC贴中的参考资料后。(该过程耗时3天)

    小白我觉得这个不适合我,所以又回到了解析JSON文件上。

    我先是按照HMCL的脚本格式自己解析了JSON

    JSON解析过程源码如下

    package minecraft.launcher;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.UUID;
    
    public class GamebatWriter {
    	String integrationArgs;
    	String completePath;
    	String fmlAgreement = " -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true";
        String mainClassPath;
        String versionArg;
        public static String main(String args[]) throws IOException {
        	String Content = null;
        	GamebatWriter o =new GamebatWriter();
        	o.FileHandle();
        	Content = o.integrationContent();
        	return (Content);
        }
        public void FileHandle() throws IOException {
            File file = new File(".\\.minecraft\\versions\\"+Mainframe.GameVersion+"\\"+Mainframe.GameVersion+".json");
        	BufferedReader tempreader = new BufferedReader(new FileReader(file));
        	String[] path;
        	String allpath = "";
        	String prepath = "";
        	String name1 = "";
        	String name2 = "";
        	String tempcontent;
        	String finalpath = "";
        	int count = 0;
        	completePath = "";
        	while ((tempcontent = tempreader.readLine()) != null) {//循环处理每一个文件的路径
                if(tempcontent.contains("\"name\"" ) && tempcontent.length()>38) {//取出包含"name"的内容
                	allpath = "";
                	prepath = "";
                	tempcontent = tempcontent.substring(21, tempcontent.length()-2);
                	//System.out.println(tempcontent);
                    prepath=tempcontent.substring(0,tempcontent.lastIndexOf(":"));
                	path = prepath.split("[\\.:]");//分割得到的内容,做成路径
                	int n;
                	for(n=0;n<path.length;n++) {
                		allpath=allpath+"\\"+path[n];
                		if(path.length-n == 1) {
                			name1=path[n];
                		}
                	}
                	name2 = tempcontent.substring(tempcontent.lastIndexOf(":")+1);
                	finalpath =allpath+"\\"+tempcontent.substring(tempcontent.lastIndexOf(":")+1)+"\\"+name1+"-"+name2+".jar";
                	System.out.println(finalpath);//检查最后的得到的路径
                	File chickfile = new File(".\\.minecraft\\libraries"+finalpath);
                	String AbsolutePath ;
                	if(chickfile.exists()) {//检查即将加载的支持库是否存在
                		AbsolutePath = chickfile.getAbsolutePath();
                		System.out.println(AbsolutePath);
                		completePath=completePath + AbsolutePath + ";";//若存在就把该支持库的绝对路径加入命令行中
                	}else {
                		count++;//记录有多少个支持库不存在
                	}
                	
                }else if(tempcontent.contains("\"mainClass\"" )) {
                	mainClassPath = tempcontent.substring(18,tempcontent.length()-2);
                	System.out.println("mainClassPath = "+mainClassPath);//此处是误区,我在分析HMCL的脚本时误将 -mainClassPath= 当作启动参数,导致后面各种无法启动
                }
            }  
        	System.out.println(completePath);
        	System.out.println("有" + count + "个支持库未找到。");
        	versionSentence();//获取版本.jar
        	UUIDMake();//因为非正版启动,所以随机生成一份UUID即可
        	tempreader.close();//关闭读取流,以免过多占用内存
        	completePath = completePath.substring(0,completePath.length()-1);//去掉最末尾的斜杠
        }
        public void versionSentence() {
        	File versionJar = new File(".\\.minecraft\\versions\\"+Mainframe.GameVersion+"\\"+Mainframe.GameVersion+".jar");
        	if(versionJar.exists()) {
        		versionArg = versionJar.getAbsolutePath();
        	}
        }
        String foreUUID;
        public void UUIDMake() {
        	foreUUID = UUID.randomUUID().toString();
        	foreUUID = foreUUID.replace("-", "");
        }
        String assetsPath = Mainframe.GameAbsolutePath + "\\assets";
        public String integrationContent(){
        	integrationArgs="\"" + Mainframe.JavaFinalDir + "\" -Xmn" + Mainframe.MinMemory + "m -Xmx" + Mainframe.MaxMemory
        			+ "m -Djava.library.path=" + Mainframe.NativesDir + fmlAgreement + " -cp \"" + completePath + ";" + versionArg
        			+ "\" " + mainClassPath +" --username " + Mainframe.PlayerName + " --version \"THEMEDALAUNCHER\" --gameDir "
        			+ Mainframe.GameAbsolutePath + " --assetsDir " + assetsPath + " --assetIndex 1.12"
        			+ " --uuid " + foreUUID + " --accessToken " + foreUUID +" --userType Legacy --versionType \"THEMEDALAUNCHER\"" 
        			+ " --height " + Mainframe.FrameSizey + " --width " + Mainframe.FrameSizex;
            /*以上为完整的启动参数,其中部分内容无需改动
            *将会在下面的JSON解析中讲到
            */
        	System.out.println(integrationArgs);
        	System.out.println(Mainframe.GameVersion);
        	integrationArgs = integrationArgs.replace(".\\", "");
            return (integrationArgs);
        }
    }

    代码有些部分比较冗杂。还望见谅

     

    以上内容绝大部分通过解析JSON获得,部分内容因非必要与版本同步,所以采用内置存储。

    接下来我会以 1.12.2.json 为例讲一下我是如何解析JSON的。

    将JSON文件以记事本方式打开,可见以下内容。 我将需要解析部分单独标注

    {
        "assetIndex": {//参数中的assetIndex数据从这里的"id"下取出
            "id": "1.12",
            "sha1": "e75e9535754c6f2158b0b18b35660f45c4495d78",
            "size": 169257,
            "url": "https://launchermeta.mojang.com/mc/assets/1.12/e75e9535754c6f2158b0b18b35660f45c4495d78/1.12.json",
            "totalSize": 127722338
        },
        "assets": "1.12",//参数中的asset数据从这里直接取出
        "downloads": {
            "client": {
                "sha1": "0f275bc1547d01fa5f56ba34bdc87d981ee12daf",
                "size": 10180113,
                "url": "https://launcher.mojang.com/mc/game/1.12.2/client/0f275bc1547d01fa5f56ba34bdc87d981ee12daf/client.jar"
            },
            "server": {
                "sha1": "886945bfb2b978778c3a0288fd7fab09d315b25f",
                "size": 30222121,
                "url": "https://launcher.mojang.com/mc/game/1.12.2/server/886945bfb2b978778c3a0288fd7fab09d315b25f/server.jar"
            }
        },
        "id": "1.12.2",//参数中的游戏版本可以由此取出。不过--version现在并不重要。随意内容均可
        "libraries": [//以下为需要载入的支持库。支持库在参数中以 -cp  开头载入。注意,要将所有支持库路径写出后将所有路径用双引号括住每个路径之间用一个分号(;)隔开
            {
                "name": "com.mojang:patchy:1.1",//这里是支持库的路径及名称
    //该支持库路径为\.minecraft\libraries\com\mojang\patchy\1.1\patchy-1.1.jar
                "downloads": {//这里是该支持库的下载地址、大小、哈希值、及路径
                    "artifact": {
                        "size": 15817,
                        "sha1": "aef610b34a1be37fa851825f12372b78424d8903",
                        "path": "com/mojang/patchy/1.1/patchy-1.1.jar",//路径可以直接取该值,我也才发现这一行,但我不打算改源码了
                        "url": "https://libraries.minecraft.net/com/mojang/patchy/1.1/patchy-1.1.jar"
                    }
                }
            },
              
    。
    。
    。
    。
    。。。。。省略一万个支持库路径。。。。。
    。
    。
    。
    。
    。
    。
    
    
    
        "mainClass": "net.minecraft.client.main.Main",//客户端的main类 必须载入 载入时直接在库后面空格 再加上该value即可
    
    //以下内容在原文件中为一行,这里为了方便讲解,我将它拆成多行来讲解。
        "minecraftArguments": "--username ${auth_player_name}//玩家昵称。
     --version ${version_name}//版本号,不过并不是需要和版本同步的,随意内容均可
     --gameDir ${game_directory}//游戏路径,精确到\.minecraft
     --assetsDir ${assets_root}//assets的路径,精确到\.minecraft\assets
     --assetIndex ${assets_index_name}//由该文件第一行位置取到
     --uuid ${auth_uuid}//非正版登录可随机一个UUID JAVA有随机UUID的API
     --accessToken ${auth_access_token}//同上UUID
     --userType ${user_type}//不明确 一般填Legacy
     --versionType ${version_type}",//该版本号也是非必要。不过会在游戏刚启动后的左下角显示。
        "minimumLauncherVersion": 18,//最低启动器版本号。无用
        "releaseTime": "2017-09-18T08:39:46+00:00",
        "time": "2018-06-25T15:37:20+00:00",
        "type": "release"
    }

    解析出来的JSON应该如下

    "C:\Program Files\Java\jre1.8.0_181\bin\javaw.exe"
     -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
     -XX:+UseG1GC
     -XX:-UseAdaptiveSizePolicy
     -XX:-OmitStackTraceInFastThrow
     -Xmn128m
     -Xmx2048m
     -Djava.library.path=[游戏根目录]\.minecraft\versions\1.12.2\1.12.2-natives
     -Dfml.ignoreInvalidMinecraftCertificates=true
     -Dfml.ignorePatchDiscrepancies=true
     -cp /C:/Users/郑志钦/Desktop/格式工厂输出/3d/HMCL-2.4.1.6.exe org.jackhuang.hellominecraft.launcher.Launcher
     -cp "[游戏根目录]\.minecraft\libraries\com\mojang\patchy\1.1\patchy-1.1.jar;
    。
    。。。。省略一万个支持库路径。。。。
    。
    [游戏根目录]\.minecraft\libraries\com\mojang\text2speech\1.10.3\text2speech-1.10.3.jar;
    [游戏根目录]\.minecraft\versions\1.12.2\1.12.2.jar"
     net.minecraft.client.main.Main
     --username need
     --version "HMCL 2.4.1.6"
     --gameDir [游戏根目录]\.minecraft
     --assetsDir [游戏根目录]\.minecraft\assets
     --assetIndex 1.12
     --uuid e877c56e4fb621e81fd30dbd114a545b
     --accessToken e877c56e4fb621e81fd30dbd114a545b
     --userType Legacy
     --versionType "HMCL 2.4.1.6"
     --height 480
     --width 854

    与HMCL生成脚本不同的是

    1. -cp 后用的不是 等号 而是双引号

    2. 在客户端main类的前端没有 -mainClasspath=

    最重要的一点是以上所有参数之间使用空格隔开并且没有换行。

    在写完解析JSON后,尝试使用JAVA自带的RUNTIME启动cmd运行以上参数

    public void run() {
            String nice = null;
    		try {
    			nice = GamebatWriter.main(null);
    		} catch (IOException e1) {
    			System.out.println(e1.getMessage());
    			e1.printStackTrace();
    		}
    		System.out.println("nice = " + nice);
            String cmd = "cmd /c " + nice;
            try {
    			p = Runtime.getRuntime().exec(cmd);
    			isGameRunning = true;
    			System.out.println("游戏已启动");
    		} catch (IOException e1) {
    			System.out.println(e1.getMessage());
    			e1.printStackTrace();
    		} 
        }
    

    但是并没有成功。

    多方查阅资料后,在某篇文章中看到了 需要在 "cmd /c "后加上"start \"\" "

    改正后该句代码为

    String cmd = "cmd /c start \"\" " + nice;

    即可正常启动。

    以上为启动器的启动功能解析及JSON解析。


    接下来因为启动器在启动游戏后要与服务端取得通信以完成用该启动器启动游戏的玩家无需再输入密码就可以直接进入服务器的功能

    需要启动器在启动游戏后依然可以操作

    但是因为本人技术所限,所以无法做到process不阻塞主进程。

    在尝试编写自定义监听器未果后。我又开动小脑筋改了方向。

    既然启动游戏前的界面被阻塞了。那我就再创建另外一个界面不就好了

    于是在启动游戏后--获取缓冲流之前的代码区间里 ,

    我先是隐藏了启动前的窗口,然后再创建了一个新的窗口用于与服务器端通信。解决了游戏启动后进程卡死的情况。

     

                            #以上方法行不通所有进程依旧会被阻塞#


    接下来要实现的任务——找到启动游戏后直连服务器的参数

    展开全文
  • springboot自定义starter启动器

    万次阅读 2020-10-18 01:43:39
    第二步、删除不需要的内容(启动类、除下面spring-boot-starter的其它依赖,maven编译插件) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-...

    第一步、创建 xxx-spring-boot-starter 的spring Initializr模块

    在这里插入图片描述
    填写group 和 artifact其它默认即可

    在这里插入图片描述
    在这里插入图片描述

    第二步、删除不需要的内容(启动类、除下面spring-boot-starter的其它依赖,maven编译插件)

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter</artifactId>
    </dependency>
    

    如下是完整的pom.xml
    实际上如果当前starter需要引用其它依赖加入到dependences里面即可,这里只做演示项目

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>top.huashengshu</groupId>
        <artifactId>my-spring-boot-starter</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>my-spring-boot-starter</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>11</java.version>
        </properties>
    
        <dependencies>
            <!--   保留这个依赖即可,其它依赖都删除     -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
        </dependencies>
    </project>
    

    项目结构截图

    在这里插入图片描述

    第三步、写代码,对外提供一些自己写的类

    创建HelloProperties.java,直接复制下面代码,然后选择包进行粘贴,Idea会自动创建对应类代码设置好包名

    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "hello") // 对外提供的前缀,相当于其它引入当前starter在properties文件使用hello.属性即可对下面属性进行赋值
    public class HelloProperties {
    
        private String prefix; // 成员属性,意思是前缀名
        private String suffix; // 成员属性,意思是后缀名
    
        public String getPrefix() {
            return prefix;
        }
    
        public void setPrefix(String prefix) {
            this.prefix = prefix;
        }
    
        public String getSuffix() {
            return suffix;
        }
    
        public void setSuffix(String suffix) {
            this.suffix = suffix;
        }
    }
    

    创建HelloService.java直接复制下面代码,选择包进行粘贴即可生成

    public class HelloService {
    
        HelloProperties helloProperties;
    
        public HelloProperties getHelloProperties() {
            return helloProperties;
        }
    
        public void setHelloProperties(HelloProperties helloProperties) {
            this.helloProperties = helloProperties;
        }
    
        public String sayHello(String name){
            return helloProperties.getPrefix() +" "+name +" "+helloProperties.getSuffix();
        }
    }
    

    创建配置类(和前面一样复制粘贴即可)HelloServiceAutoConfiguration.java,将HelloService注入到IOC容器中

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ConditionalOnWebApplication    // 条件配置类,该注解表示在web环境下才生效,相关的其它条件可以使用@ConditionXXX
    @EnableConfigurationProperties(HelloProperties.class) // 表示HelloProperties作为配置类使用
    public class HelloServiceAutoConfiguration {
    
        @Autowired
        HelloProperties helloProperties;	// 作为配置类目的就是想在sayHello方法返会的字符串加上前缀和后缀
    
        @Bean
        public HelloService helloService() { // 将HelloService注入到IOC容器
            HelloService service = new HelloService();
            service.setHelloProperties(helloProperties);
            return service;
        }
    }
    

    第四步、在resources资源文件夹下创建一个META-INF文件夹,并创建一个spring.factories文件

    如下面截图
    在这里插入图片描述
    内容则是将@Configuration配置类加入,目的是将配置加入到外部的IOC容器中

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=
    

    idea中右键copy–》copy reference,将复制的值填入上面=右边

    注意:如果有多个AutoConfiguration则用逗号分开,还有回车小心前面的空格,最好没有其它字符。

    在这里插入图片描述
    例如:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    top.huashengshu.myspringbootstarter.HelloServiceAutoConfiguration,\
    top.yumbo.music.starter.configuration.YumboMusicAutoConfiguration
    

    第五步、将该项目发布的maven仓库,或者安装到本地仓库中让其它项目能使用的到

    本地安装为例:
    在这里插入图片描述
    成功后即可
    在这里插入图片描述

    第六步、测试自己定义的启动器使用有效

    创建一个springboot项目
    勾选web模块即可,然后加入自定义启动器的gav依赖
    在启动类中加入内部类(这里为了方便演示不按照规范创建包)
    如下示例代码

    启动类
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import top.huashengshu.myspringbootstarter.HelloService;
    
    @SpringBootApplication
    public class DemoApplication {
    	
        @RestController
        public class HelloController {
    
            @Autowired
            HelloService helloService; // 注入HelloService
    
            @GetMapping("/hello") // 暴露一个/hello 请求路径对外提供服务
            public String hello(){
                return helloService.sayHello("zhang san"); // 返回带有前缀和后缀中间是 "zhang san"的字符串
            }
    
        }
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
    }
    
    properties文件

    因为使用了@ConfigurationProperties(prefix = "hello")注解所以在当前项目的properties文件中使用hello前缀调用即可对成员属性赋值

    在这里插入图片描述
    如下

    hello.prefix=HUASHENGSHU
    hello.suffix=Hello World
    
    运行当前项目,访问/hello验证是否有效

    如下:
    在这里插入图片描述
    说明自定义starter成功。

    其它业务代码,根据自己的需求自己加入依赖,也就是说可以自己定义starter提供给其它人用!

    展开全文
  • 是否可以通过Python启动器(py.exe)启动Anaconda安装的Python解释器? 分析 一、 启动Python解释器有三种方法: 根据指定Python解释器的路径执行。按照这种方法是启动指定解释器最保险的方法。 在CMD中运行python....

    问题

    是否可以通过Python启动器(py.exe)启动Anaconda安装的Python解释器?

    分析

    一、 启动Python解释器有三种方法:

    • 根据指定Python解释器的路径执行。按照这种方法是启动指定解释器最保险的方法。
    • 在CMD中运行python.exe。这种方法会根据一定规则在系统环境变量Path及相关路径中进行搜索,执行最先搜索到的Python解释器。(此处不再考虑Python2、Python3并存的问题,原理类似)
    • 在CMD中运行Python启动器(py.exe)。这种方法会查找系统中安装的最新版本的Python解释器。

    二、 Anaconda在安装时有两个与Python解释器相关的选项。

    在这里插入图片描述

    • Add Anaconda to your PATH environment variable:即将Anaconda的Python解释器添加到系统环境变量Path中,官方不建议这么做,因为会对其他软件产生干扰,比如前面提到的python命令是根据系统环境变量Path的先后顺序来启动解释器的。因此,Anaconda官方强烈建议通过开始菜单中的Anaconda NavigatorAnaconda Prompt from来启动通过Anaconda安装的包或程序
    • Register Anaconda as your default Python:将Anaconda的Python解释器注册为对应主版本默认的Python解释器。Anaconda官方建议计划在本机安装多个版本的Anaconda或原生Python解释器时不要选这个选项。

    三、 Anaconda在安装时虽然会安装Python解释器,但是不会安装Python启动器(py.exe)!

    四、分别在普通CMD和Anaconda CMD执行python命令。可发现在Anaconda环境下运行的Python解释器与原生环境不同,这是因为在Anaconda环境下,会把Anaconda的相关目录加入到环境变量中。

    在这里插入图片描述

    在这里插入图片描述
    五、分别在普通CMD和Anaconda CMD执行py命令。两者结果相同,都未发现Anaconda安装的3.8.8解释器!

    结论

    Python启动器(py.exe)不会去识别Anaconda安装的Python解释器。

    Anaconda最好还是不要与Python启动器或原生的Python解释器混用,通过Anaconda Navigator或者Anaconda Prompt运行,这样能够更好的隔离环境,避免不必要的问题。

    展开全文
  • 安卓4.2.2原生桌面启动器

    热门讨论 2013-06-06 20:50:13
    安卓4.2.2原生桌面启动器
  • 在Windows中安装Python时,默认选择安排Python启动器(py.exe)。Python启动器可帮助定位和执行不同版本的Python解释器。 Python启动器(py.exe)一般自动安装在Windows目录中。 C:\Users\yy>whereis py.exe C:\...

    Python解释器概述

    在Windows中安装Python时,默认选择安排Python启动器(py.exe)。Python启动器可帮助定位和执行不同版本的Python解释器。

    Python启动器(py.exe)一般自动安装在Windows目录中。

    C:\Users\yy>where py.exe
    C:\Windows\py.exe
    

    执行py -h可列出Python启动器的使用方法。

    C:\Users\yy>py -h
    Python Launcher for Windows Version 3.7.6150.1013
    
    usage:
    py [launcher-args] [python-args] script [script-args]
    
    Launcher arguments:
    
    -2     : Launch the latest Python 2.x version
    -3     : Launch the latest Python 3.x version
    -X.Y   : Launch the specified Python version
         The above all default to 64 bit if a matching 64 bit python is present.
    -X.Y-32: Launch the specified 32bit Python version
    -X-32  : Launch the latest 32bit Python X version
    -X.Y-64: Launch the specified 64bit Python version
    -X-64  : Launch the latest 64bit Python X version
    -0  --list       : List the available pythons
    -0p --list-paths : List with paths
    

    执行py -0p可列出Python解释器的名称与路径。

    C:\Users\yy>py -0p
    Installed Pythons found by py Launcher for Windows
     -3.7-64        d:\ProgramData\Anaconda3\python.exe *
     -3.7-64        C:\Users\yy\AppData\Local\Programs\Python\Python37\python.exe
     -3.5-64        "C:\Program Files\Python35\python.exe"
     -2.7-64        E:\Python27\python.exe
    

    主版本次版本相同补丁版本不同解释器选择问题

    根据帮助文件可知,Python启动器可以根据主版本、次版本和实现版本号选择启动解释器,但是对于同主版本、次版本,补丁不同的解释器则无法选择,比如d:\ProgramData\Anaconda3\python.exeC:\Users\yy\AppData\Local\Programs\Python\Python37\python.exe 显示都为-3.7-64,但是默认的是d:\ProgramData\Anaconda3\python.exe(带*),如何快速启动C:\Users\yy\AppData\Local\Programs\Python\Python37\python.exe 呢?

    按照以往的办法改变环境变量中两个解释器路径的顺序,结果无效。
    因为Python启动器选择解释器时不再考虑PATH 系统变量中的顺序,启动器将自动选择最合适的Python版本,它更倾向于按按语言版本排序,而不是使用最新安装的版本。

    但是不清楚什么原因,版本为3.7.0d:\ProgramData\Anaconda3\python.exe 优先级高于版本为3.7.6C:\Users\yy\AppData\Local\Programs\Python\Python37\python.exe

    解决办法?

    安装Python3.8.6后,-3.7-64只剩下了一个。
    但是问题仍然没有解决掉,3.7.03.7.6仍然无法通过Python启动器切换……
    我想原因如下:
    按照正常情况下如果计算机已经安装了主版本、次版本相同的Python解释器,那么再安装时是要先卸载原解释器才能安装的!但是对于anaconda这类工具附带的Python解释器可能是没有考虑到的,所以出现了这样的问题。

    C:\Users\yy>py -0p
    Installed Pythons found by py Launcher for Windows
     -3.8-64        C:\Users\yy\AppData\Local\Programs\Python\Python38\python.exe *
     -3.7-64        C:\Users\yy\AppData\Local\Programs\Python\Python37\python.exe
     -3.5-64        C:\Program Files\Python35\python.exe
     -2.7-64        E:\Python27\python.exe
    
    展开全文
  • Spring Boot的启动器Starter详解

    万次阅读 多人点赞 2016-01-30 10:15:48
    Spring Boot的启动器Starter详解作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszsSpring Boot应用启动器基本的一共有44种,具体如下:1)spring-boot-starter 这...
  • SpringBoot 自定义实现一个启动器starter 教程。

    千次阅读 多人点赞 2019-10-11 09:50:01
    说明:springboot 官方给我们提供了很多启动器如:elasticsearch,aop,redis...等等 但是实际开发中,可能不同公司的业务不同需要定制化一个通用的专属的启动器来满足公司内部使用,提高开发效率。 本文将介绍...
  • Spring Boot Starters启动器

    千次阅读 2018-11-07 08:36:34
    Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-...
  • Spring Boot Runner启动器

    千次阅读 2018-11-07 08:38:23
    Runner启动器 如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。 CommandLineRunner:启动...
  • MAC的VMware Fusion使用U盘启动器启动系统
  • 在Ubuntu18.04下将应用程序添加到启动器启动器里面给应用程序添加一个快捷方式下载并解压软件找到软件的启动文件创建快捷方式命令文件 在启动器里面给应用程序添加一个快捷方式 在linux(ubuntu)平台下,很多小...
  • Linux 创建启动器(.Desktop文件)

    万次阅读 2017-10-12 15:13:42
    启动器就是一个后缀为 .desktop 文件。 创建 intelliJ idea 的启动器 linux创建启动器
  • springboot 启动器和监听器的加载

    万次阅读 2021-06-30 09:57:27
    1. 为啥要设置初始化 setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer.class)); 2. 为啥要设置监听 setListeners((Collection) getSpringFactoriesInstances...
  • linux(deepin)在启动器上制作启动图标

    千次阅读 2017-08-01 16:59:44
    在linux中,从浏览器上下载的应用就只能找到安装后的目录,在这里就分享下我找到的在启动器上创建启动图标的方式. 默认情况下系统所有的快捷方式放在/usr/share/applications,打开该目录会看到大量的.desktop文件...
  • 今天开发板遇见了一个启动器的问题,平板上有A、B两个启动器,不知道该选哪个,然后就选择了B启动器,而且还手滑的点了默认该启动器。结果就悲催了,一直提示“启动器”停止运行,并且点击确定后,还会接着弹出来,...
  • ubuntu未信任应用无法启动器

    千次阅读 2018-04-17 19:58:38
    ubuntu下打开系统未知第三方应用时会提示“未信任的应用启动器的问题”我们只要将该应用改为“允许作为程序执行文件”即可:
  • 我的世界hmcl启动器登录教程

    万次阅读 2018-04-12 16:32:31
    一、安装下载qq群里的文件,群号418674586把文件解压后放在桌面或其他盘(解压是在压缩文件mc.zip上右键,解压到当前文件夹,不要双击解压啊)里边有两个文件HMCL是启动器,.minecraft是原版文件双击启动器HMCL-3.1....
  • Clover EFI bootloader Mac版是支持 macoS Mojave10.14的四叶草 Clover,编译了PKG安装包文件请在macOS上双打开安装,Clover文件夹是启动引导的EF启动文件,需要放到你的ESP分区,四叶草黑苹果启动器 mac版能够帮助...
  • Chrome查看应用程序(应用启动器

    千次阅读 2017-03-23 23:11:51
    在Chrome中输入下面URI即可查看,奇怪的是应用启动器不能自动下载了,可以添加书签方便查看。chrome://apps
  • 【word】对话框启动器按钮

    千次阅读 2020-01-24 09:16:05
    因此设计者在每个选项卡下面每个组别都提供了对话框启动器。就是如图左上矩形右下箭头的小按钮。 #include<stdio.h> int main() { int arr[6] = {[5] = 12}; for(int i = 0;i <6; i++) printf("%...
  • Linux mint在主菜单添加启动器

    千次阅读 2018-02-24 13:33:40
    1、右键点击菜单,选择配置,选择菜单,打开菜单编辑器2、右侧选择想要添加在哪个列表,左侧是列表下已有的启动器3、左侧选择“新建项目”,name是想要添加启动器的名字,command是启动软件的命令,comment是描述,...
  • Ubuntu在启动器添加程序快捷方式

    万次阅读 2016-06-01 14:40:17
    Ubuntu 启动器 快捷方式 Desktop Entry
  • 计算机有个问题,就是启动DCOM服务器进程启动器这个服务的时候提示:在 本地计算机 无法启动 DCOM 服务器进程启动器 服务。错误 1058: 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。解决方法是:...
  • Debian 制作U盘安装盘启动器

    万次阅读 2017-11-20 17:51:28
    简易介绍一下 制作U盘启动器: 其实debian的官方手册写的已经非常好了 i386的手册 http://www.debian.org/releases/stable/i386/  注意:制作U盘启动器,前提是需要一个Linux系统,如果没有的话只
  • 在创建火狐浏览器启动器之前,首先应该把火狐安装包提取到 usr/lib 目录下。基本提取完成后,就能够在双击 firefox 文件夹中的 firefox 可执行文件打开火狐浏览器了,而此时打开火狐浏览器都必须到该目录下进行,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,917,752
精华内容 767,100
关键字:

启动器