报错1:
(moea) aaa@ASUS:~/ML/paper/APG-SMOEA/code$ sh test.sh
python: can't open file '/home/aaa/ML/paper/APG-SMOEA/code/run_GAN-adjlvxm.py': [Errno 2] No such file or directory
Finish GAN-adjlvxm on 1
修改了run_benchmark.sh的line22->line23
报错2:
(moea) aaa@ASUS:~/ML/paper/APG-SMOEA/code$ sh test.sh
mkdir: cannot create directory ‘./result’: File exists
mkdir: cannot create directory ‘./pop’: File exists
这个错误信息表示 test.sh 脚本试图创建两个目录(./result 和 ./pop),但这些目录已经存在。mkdir 命令默认情况下不会覆盖已经存在的目录,因此会显示这样的错误。
根据你的需求,这里有几个可能的解决方案:
- 忽略目录已存在的错误: 如果目录已存在并且这不是问题,你可以在 mkdir 命令后面添加 -p 选项来忽略这个错误。
mkdir -p ./result
mkdir -p ./pop
使用 -p 参数后,如果目录已经存在,mkdir 命令不会显示错误。
- 使用 -p 参数后,如果目录已经存在,mkdir 命令不会显示错误。
[ -d "./result" ] || mkdir ./result
[ -d "./pop" ] || mkdir ./pop
- 删除旧目录然后重新创建: 如果你想确保目录是空的,你也可以先删除它,然后重新创建。
rm -rf ./result
rm -rf ./pop
mkdir ./result
mkdir ./pop
警告: rm -rf 命令会删除目录和其下所有文件,使用时请小心。
根据你的实际需求选择合适的方法。
报错3:
File "/home/aaa/ML/paper/APG-SMOEA/code/run_APG-SMOEA.py", line 7
from function.APG-SMOEA_framework import optimize
Python 的模块名(也就是 .py 文件名)不应该包含短横线(-)。根据 Python 的命名规约,模块名应该是小写字母,并且可以包含下划线。
如果你有一个名为 APG-SMOEA_framework.py 的文件,并且你试图用 import 语句导入它,Python 会因为短横线而报错,因为它不是一个合法的 Python 标识符。
解决方案是将文件名和对应的 import 语句中的短横线(-)改为下划线(_)或其他合法的 Python 标识符字符。
例如,你可以将文件名改为 APG_SMOEA_framework.py,然后更新 import 语句为:
from function.APG_SMOEA_framework import optimize
对sh test.sh进行计时
test.sh 的脚本内容如下:
#!/usr/bin/env bash
# 入口脚本!
# result生成原始结果 paper_process使用
mkdir -p ./result
# 在nikkei上的两个实验生成讨论的结果 discussion_process使用
mkdir -p ./pop
mkdir -p ./trial_len
# 数字控制跑哪些测试集bash run_all.sh
# instance序号:1-hangseng 2-dax 3-ftse 4-sp 5-nikkei
bash ./run_benchmark.sh 1
在命令行运行test.sh,它需要运行很久,我想记录一下,它到底是运行了多久,要如何处理?
要测量test.sh运行所需的时间,你可以在运行脚本之前使用time命令,像这样:
time sh test.sh
这将在脚本执行完成后显示实际时间、用户时间和系统时间。
time sh test.sh 命令通常会显示三种时间:
real: 实际经过的墙钟时间。
user: 用户态代码执行时间。
sys: 内核态代码执行时间。
这些时间通常以分钟和秒的形式显示,例如 1m30.002s 表示1分钟30.002秒。如果执行时间很短,它可能只会以秒或者毫秒来显示。所以,是的,显示的时间通常包括秒作为单位,但也可能包括分钟。
那上面的三个时间,到底哪个是真实的程序运行的时间呢?
或者,你也可以修改你的test.sh脚本,在脚本内部记录开始和结束时间:
#!/usr/bin/env bash
start_time=$(date +%s) # 记录开始时间
# 你的原始代码
mkdir -p ./result
mkdir -p ./pop
mkdir -p ./trial_len
bash ./run_benchmark.sh 1
end_time=$(date +%s) # 记录结束时间
elapsed_time=$(expr $end_time - $start_time)
echo "耗时: $elapsed_time 秒"
这两种方法都可以让你了解脚本需要多长时间来运行。
脚本解读
解读1
benchmarks=("hangseng" "dax" "ftse" "sp" "nikkei")
# 分别做五个测试集上的两个实验对比测试
mkdir -p ./result/${benchmarks[$1-1]}
mkdir -p ./result/${benchmarks[$1-1]}/GAN-adjlvxm
这段 Bash 脚本的代码主要执行了以下操作:
- 定义了一个名为 benchmarks 的数组,包含五个字符串元素:hangseng、dax、ftse、sp、nikkei。
- 使用 mkdir -p 命令创建两个目录。
在这里,${benchmarks[$1-1]} 是一个 Bash 数组的索引方式。$1 是脚本的第一个参数,$1-1 是将这个参数减去 1(因为 Bash 数组是从 0 开始计数的)。所以 ${benchmarks[$1-1]} 将从 benchmarks 数组中选择一个元素。
举例来说:
- 如果你运行脚本并传入参数 1,那么 ${benchmarks[$1-1]} 将返回 hangseng。
- 如果传入参数 2,则返回 dax。
- 以此类推。
然后,mkdir -p ./result/${benchmarks[$1-1]}
和 mkdir -p ./result/${benchmarks[$1-1]}/GAN-adjlvxm
这两行代码将基于选定的数组元素创建两个目录。
例如,如果传入参数 1,脚本将创建以下目录:
./result/hangseng
./result/hangseng/GAN-adjlvxm
mkdir -p
选项确保如果目录已存在,命令不会报错,并且会创建任何缺少的父目录。
解读2
python run_APG-SMOEA.py $1 >> ./result/${benchmarks[$1-1]}/GAN-adjlvxm/igd.txt
>>符号是将什么的输出给重定向到igd.txt中
在 Bash 和其他 Unix-like 的 shell 中,>> 符号用于重定向命令的标准输出(stdout)到一个文件,并追加到该文件的末尾。如果文件不存在,将创建该文件。
在你给出的这个例子中:
python run_APG-SMOEA.py $1 >> ./result/${benchmarks[$1-1]}/GAN-adjlvxm/igd.txt
python run_APG-SMOEA.py 1 命令会运行一个 P y t h o n 脚本,并将脚本的标准输出追加到 . / r e s u l t / 1 命令会运行一个 Python 脚本,并将脚本的标准输出追加到 ./result/ 1命令会运行一个Python脚本,并将脚本的标准输出追加到./result/{benchmarks[$1-1]}/GAN-adjlvxm/igd.txt 文件中。
简单来说,任何 run_APG-SMOEA.py 脚本打印(输出)到控制台(终端)的信息将被追加到 igd.txt 文件中,而不是显示在终端上。
例如,假设 run_APG-SMOEA.py 脚本包含如下代码:
print("Hello, World!")
运行上述 Bash 命令后,Hello, World! 将不会在终端显示,而是会被追加到 ./result/${benchmarks[$1-1]}/GAN-adjlvxm/igd.txt 文件的末尾。
准确地说,run_APG-SMOEA.py 脚本中的 print() 函数产生的输出(也就是标准输出,或 stdout)将被重定向并追加到 igd.txt 文件中,而不会出现在终端窗口。这是 >> 符号在 Bash 脚本中的作用。
py文件的命名带有-
上面的python run_APG-SMOEA.py 这里面也有-符号啊,也可以正常运行啊?为什么之前说python的文件名只能是字母和下划线的组合呢?
Python 脚本文件名(比如 .py 文件)确实可以包含短横线(-),并且你可以正常地运行这样命名的文件。比如,通过命令行 python run_APG-SMOEA.py 这样是完全可以的。
然而,问题出现在当你尝试导入这样一个带有短横线命名的 Python 文件作为模块时。Python 的模块名必须是有效的 Python 标识符,而有效的 Python 标识符不能包含短横线。这就是为什么在 import 语句中你不能直接导入带有短横线的 Python 文件。
总结一下:
可以使用 python run_APG-SMOEA.py 来运行这样命名的脚本。
不能使用 import run_APG-SMOEA 来导入这样命名的文件作为一个模块。