Linux上编写和运行Python\Java
1.Ubuntu用vim编写和运行Python代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~$ mkdir -p Projects/Python
xiaoyu@xiaoyu-VMware-Virtual-Platform:~$ cd ./Projects/Python
xiaoyu@xiaoyu-VMware-Virtual-Platform:~$ vim Hello.py
按i键进入输入模式
然后Hello.py中输入:
print("Hello World!")
按Esc键回到普通模式,输入:wq,保存并退出
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$ python3 Hello.py
Hello World!
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$
python3 文件名.py
就可以运行Python文件了
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$ vim guessNumber.py
同上,编写如下Python代码:
import random
number = random.randint(1,100)
cnt = 0
while True:
num = int(input("请输入您猜测的数字:"))
cnt += 1
if num == number:
print(f"恭喜您,猜对了。您一共猜了{cnt}次。")
break
elif num < number:
print("猜小了,请再猜一次")
else:
print("猜大了,请再猜一次")
同理保存并退出
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$ python3 guessNumber.py
请输入您猜测的数字:50
猜大了,请再猜一次
请输入您猜测的数字:25
猜小了,请再猜一次
请输入您猜测的数字:34
猜小了,请再猜一次
请输入您猜测的数字:42
猜小了,请再猜一次
请输入您猜测的数字:46
猜小了,请再猜一次
请输入您猜测的数字:48
恭喜您,猜对了。您一共猜了6次。
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$
2.Centos7上编写Python代码
[root@master ~]# python --version
Python 2.7.5
[root@master ~]# ls
anaconda-ks.cfg
[root@master ~]# cd /
[root@master /]# ls
bin boot demo01 dev etc folder3 home lib lib64 media mnt opt parent proc root run sbin srv sys tmp usr var
[root@master /]# mkdir Projects/Python
mkdir: cannot create directory ‘Projects/Python’: No such file or directory
[root@master /]# mkdir -p Projects/Python
[root@master /]# vim Projects/Python/Hello.py
[root@master /]# python Projects/Python/Hello.py
Hello Python! Hello Centos7!
[root@master /]# cd Projects/Python
[root@master Python]# ls
Hello.py
[root@master Python]# cd -
/
[root@master /]# cd ./Projects/Python
[root@master Python]# ls
Hello.py
[root@master Python]# cat Hello.py
print("Hello Python! Hello Centos7!")
[root@master Python]#
3.Centos7上编写Java代码
[root@master Projects]# mkdir Java
[root@master Projects]# ls
Java Python
[root@master Projects]# cd Java
[root@master Java]# vim BinarySearch.java
1 public class BinarySearch {
2 public static void main(String[] args) {
3 int[] arr = {-9, -7, -5, -1, 0, 1, 2, 8, 12, 17, 25, 26 };
4 System.out.println(binarySearch(arr, 12 ));
5 System.out.println(binarySearch(arr, -12));
6 }
7
8 private static int binarySearch(int[] arr, int target) {
9 int left = 0, right = arr.length - 1;
10 while (left <= right) {
11 int mid = left + (right - left) / 2; // 防止int类型溢出
12 if (arr[mid] == target) {
13 return mid;
14 } else if (arr[mid] < target) {
15 left = mid + 1;
16 } else {
17 right = mid - 1;
18 }
19 }
20
21 return -1;
22 }
23 }
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
:set number
编写上述Java代码,并在普通模式下输入“ :set nunber”可以临时显示行号
保存并退出
[root@master Java]# javac BinarySearch.java # 编译Java代码
[root@master Java]# ls
BinarySearch.class BinarySearch.java
[root@master Java]# java BinarySearch.java # 运行Java程序
Error: Could not find or load main class BinarySearch.java
[root@master Java]# java BinarySearch.calss # 运行Java程序
Error: Could not find or load main class BinarySearch.calss
[root@master Java]# java BinarySearch # 运行Java程序
8
-1
注意注意,千万要注意:
使用java命令运行Java文件时不能加后缀名,无论是.java还是.class都不能加
原因:
- Java程序运行机制:在编译阶段,用javac(Java Compiler)处理源文件(即.java文件),因此需要加上.java后缀名。而在运行阶段,Java则在加载类,后面不需要后缀名,只需要类名
- java命令会启动JVM(Java虚拟机),JVM需要加载的是类名(class name),类名对应的是BinarySearch.class文件中的二进制字节码。然后JVM会自动查找BinarySearch.class文件中并执行其中的main方法
注意:
运行java程序要用javac命令编译,编译完成之后会生成.class文件,然后再使用java命令去让JVM执行.class文件,java命令后面跟的是类名,不能是.class文件的路径
javac命令编译源文件(.java文件),有-cp参数,这个参数的作用是告诉编译器去哪里找被引用的第三方类(依赖,import导入的类),于java命令的-cp参数的作用有区别(java命令的-cp参数作用是告诉Java虚拟机JVM到哪里去找已经编译好的.class文件或,jar包)
.jar包是Java中用于打包和分发类文件、资源文件的标准归档格式,JAR = Jave Archive(Java归档文件)。.jar包本质上是一个特殊的ZIP文件
| 类比 | 说明 |
|---|---|
Windows的.exe | 可执行程序(如果包含主类) |
Linux的.deb/.rpm | 软件包,方便分发 |
Python的.whl | 打包好的库 |
普通的.zip | 但多了清单文件和类加载机制 |
[root@master ~]# ls
anaconda-ks.cfg hadoop-3.1.4.tar.gz
[root@master ~]# cd /
[root@master /]# ls
bin boot data demo01 dev etc home lib lib64 media mnt opt parent proc Projects root run sbin srv sys tmp usr var
[root@master /]# cd demo01
[root@master demo01]# ls
Hello.class Hello.java
[root@master demo01]# java Hello # 在Hello.class所在的目录下使用java命令,可以不使用-cp参数
Hello Hadoop!
[root@master demo01]# cd
[root@master ~]# java /demo01/Hello # 不在Hello.class所在的目录下要运行它,必须要使用-cp指定路径,如果不用-cp参数直接指定.class的路径,则java命令会将这个路径当成类名,这显然是错误的,没有这样的类名
Error: Could not find or load main class .demo01.Hello
[root@master ~]# java /demo01/Hello.class
Error: Could not find or load main class .demo01.Hello.class
[root@master ~]# java -cp . Hello
Error: Could not find or load main class Hello
[root@master ~]# cd /demo01
[root@master demo01]# ls
Hello.class Hello.java
[root@master demo01]# java -cp . Hello # -cp .表示让JVM在当前目录下去找.class文件
Hello Hadoop!
| 命令 | 参数接受 | 原因 |
|---|---|---|
javac | 文件路径(.java 文件) | 编译器需要读取源文件,就像 cat、vim 一样 |
java | 类名(不是文件路径) | JVM 需要通过类名 + classpath 机制加载类 |
-cp和-classpath参数的效果一致
[root@master ~]# java -cp /demo01/ Hello
Hello Hadoop!
[root@master ~]# java -classpath /demo01 Hello
Hello Hadoop!
| 写法 | 含义 | JVM如何查找 |
|---|---|---|
-cp /demo01/ | 路径带斜杠 | 把 /demo01/ 当作目录,去里面找 Hello.class |
-cp /demo01 | 路径不带斜杠 | 把 /demo01 当作目录,去里面找 Hello.class |
结论:对于目录,加不加末尾的 /,JVM 处理方式完全相同。
JVM 在解析 classpath 时,会自动规范化路径:
-
/demo01/→ 标准化为/demo01 -
/demo01→ 保持/demo01
两者最终指向同一个目录。
下列情况末尾加/和不加/时有区别:
1.当路径指向一个.jar包时
# 正确:指向具体的 jar 文件
java -cp /demo01/lib.jar Hello
# 错误:末尾加斜杠会被当作目录,但 lib.jar/ 不是目录
java -cp /demo01/lib.jar/ Hello # ❌ 找不到类
2.当使用通配符*时:
# 加载 /demo01 目录下所有 jar 包
java -cp "/demo01/*" Hello
# 末尾加斜杠含义不同
java -cp "/demo01/*/" Hello # 试图找名为 * 的目录,语法错误
| 路径写法 | 效果 |
|---|---|
-cp "/demo01/*" | 加载 /demo01 目录下的所有 .jar 文件 |
-cp "/demo01/" | 只加载 /demo01 目录下的类文件(.class) |
-cp "/demo01" | 同上,加载目录下的类文件 |
这里加双引号包裹起来详细可以自己搜索它的作用
在Linux实际操作中,什么时候要在目录末尾加/什么时候不用加/:
| 你想做什么 | 写法 | 加 /? |
|---|---|---|
| 进入目录 | cd /path | ❌ 不加 |
| 查看目录内容 | ls /path | ❌ 不加 |
| 删除整个目录 | rm -rf /path | ❌ 不加 |
| 复制目录到别处 | cp -r /path /dest | ❌ 不加 |
| 复制目录内容到别处 | cp -r /path/* /dest/ | ❌ 不加(用通配符) |
| 同步目录内容(rsync) | rsync -av /src/ /dst/ | ✅ 源和目标都加 |
| 打包目录 | tar -czf file.tar.gz /path | ❌ 不加 |
| 打包目录内容 | cd /path && tar -czf file.tar.gz . | 用 . 代替 |
| 检查路径是否是目录 | [ -d /path ] | ❌ 不加 |
日常操作统一不加 /,只在以下两种情况加:
-
使用
rsync且确定要同步内容时 -
需要穿透符号链接查看目标目录时
记住:除非你知道为什么需要加 /,否则就不加。这是最安全的做法。
更多推荐


所有评论(0)