pyinstaller打包exe后在非开发电脑上运行,报错找不到文件,添加打印后发现运行在了(win10)user/local/temp路径下,由于使用的相对路径,导致找不到程序目录下的文件了
解决方式:
不让它在local/temp下运行暂时不好处理,因此想办法使用绝对路径
最开始使用的方法是:
file_path = Path(__file__).resolve()
dir_path = file_path.parent
发现再运行依然获取到的路径是local/temp
后来发现可以换这种方式:
path, app_name = os.path.split(sys.argv[0])
os.chdir(path)
问题解决 Hi~ o(* ̄▽ ̄*)ブ
发现在linux上这样运行path是空字符串,查到一种方式,这里没有实测,后续再研究
script_path = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_path)
下面介绍一下python的sys.argv
sys.argv 是 Python 的 sys 模块中的一个非常有用的列表,它包含了从命令行传递给 Python 脚本的参数。sys.argv 的第一个元素(sys.argv[0])通常是执行脚本的名称(可能是脚本的路径,取决于你如何调用它)。其余的元素(sys.argv[1:])则是任何附加的命令行参数。
示例
假设你有一个名为 script.py 的 Python 脚本,内容如下:
import sys
print("脚本名称:", sys.argv[0])
print("参数列表:", sys.argv[1:])
for i, arg in enumerate(sys.argv[1:], start=1):
print(f"参数 {i}: {arg}")
如果你在命令行中这样运行这个脚本:
python script.py arg1 arg2 arg3
输出将会是:
脚本名称: script.py
参数列表: ['arg1', 'arg2', 'arg3']
参数 1: arg1
参数 2: arg2
参数 3: arg3
注意事项
- sys.argv 是一个列表,所以你可以使用所有列表操作来访问和处理它。
- 当你从命令行传递参数时,它们通常是字符串。
- 如果你的脚本被用作其他脚本或应用程序的一部分(例如,通过 subprocess 模块调用),那么 sys.argv[0] 可能会是不同于你期望的值。
- 在编写需要命令行参数的脚本时,最好为这些参数提供默认值或使用命令行解析库(如 argparse),以便在参数缺失或格式不正确时提供有用的反馈。
使用 argparse 模块
对于更复杂的命令行参数处理,Python 的 argparse 模块提供了强大的功能。这个模块允许你定义参数的类型、默认值、帮助消息等,并可以自动生成帮助文档。以下是一个简单的 argparse 示例:
import argparse
parser = argparse.ArgumentParser(description='一个简单的命令行参数示例')
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='一个或多个整数')
parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max,
help='求和(默认:求最大值)')
args = parser.parse_args()
print(args.accumulate(args.integers))
这个脚本定义了两个参数:一个是位置参数(需要至少一个整数),另一个是可选的 --sum 标志。你可以像这样运行它:
python script.py 1 2 3 4 --sum
或者简单地:
python script.py 1 2 3 4
在第二种情况下,脚本将使用 max 函数(因为 --sum 标志没有提供)。