python实现清华大学联网助手(三)——linux下带参数的自定义命令/import机制

Linux 安装miniconda 配置清华镜像 并安装pytorch 文章目录1. 下载Miniconda2. 设置镜像源 - 清华镜像2.1 设置不进入默认的环境3. 使用conda创建运行环境4. 安装pytorch 1. 下载Miniconda 准备,miniconda 文件夹 mkdir miniconda cd miniconda/ 从镜像中下载miniconda wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh 阅读详情

上两篇已经大致满足了我起初设计的需求。

最后,对代码进行了一些优化,并且修改代码使一些函数方法可以重用。最终实现了如下功能:登录校园网、登出校园网、查询当前网络状态、查询流量、帐户余额、当前用户组等基本信息、查询本账号当前在线IP信息、查询每日流量使用明细并生成直方图。


本篇主要探讨两个问题:

1 如何将.py脚本制作成linux下带参数的自定义命令;

2 import机制及使用。


1 如何将.py脚本制作成linux下带参数的自定义命令:

具体要求:

咱们有1个py脚本文件,它可以接受很多参数。但现在要执行它,必须先cd到.py文件的目录下,然后python pytunet.py -i -a --check。当然可传入的参数有很多,比如-i -o -a -h --check等等,每一次执行都可能是这些参数的任意组合。但操作这么麻烦,违背了初衷。要是这样还不如打开浏览器登录我的网费查询账户呢。因此我们迫切需要一个方法,让它成为一个自定义命令。


解决办法:

a) 写一个shell脚本,将参数传给pyhton脚本,然后将shell脚本放在自己的bin下。

显然这个方法可以实现,但比较麻烦,难道没有更好的办法了吗?


b) 修改linux的默认python解释器,#!/usr/bin/env python,给主脚本修改755执行权限,将alias写到.bashrc中去。

可能这么一说我们并不懂,我们一条一条来看。

①修改linux的默认python解释器。

因为一般linux都是预装python2的版本,而且系统内一些例行程序都需要python2,因此我们并不能删除。首先我们要安装python3.4。再删除原来/usr/bin下的python符号链接,再将python3.4设置为新的python符号链接。

sudo rm /usr/bin/python

sudo ln -s /usr/bin/python3.4 /usr/bin/python

这样我们的python3.4就是默认的解释器了。


②将#!/usr/bin/env python作为你脚本文件中的第一句。

这样的话,我们就不必为脚本指定python3.4作为运行该脚本的解释器。因为开头包含#符号,所以一般情况下被视作注释。在执行脚本时,如果指定了解释器则忽视这段代码。如果没指定,就默认使用该代码所指定的解释器。

因此python ./pytunet.py -q也就可以写作./pytunet.py -q了。

这样离我们的目标更近了一些。


③给主脚本设置755权限。

一般文件的权限是rwxr--r--类似这样的形式。分别表示root用户, 同组用户和其他用户的权限。r为读权限,w为写权限,x为执行权限,-表示没有这种权限。同样为了更为简单的表示,我们用二进制数来代表响应的权限,如rwx为111,r-x为101,对应的十进制数rwx为7,r-x为5。因此所谓的755权限是rwxr-xr-x。一般而言,在我们普通的私人电脑中,设置755权限是没有问题的。因此可以放心。

那么我们可以这样设置主脚本的权限:sudo chmod 755 pytunet.py。


④将alias写到.bashrc。

sudo权限打开用户路径下$HOME/.bashrc隐藏文件。选一个合适的位置加上如下alias:

alias tunet=‘/home/coderhuhy/mycommands/pytunet.py’,这里是你自己保存py脚本的位置。tunet为其别名。

保存并关闭.bashrc。注意需要重启或注销电脑,或者source ~/.bashrc。


由此一来你就可以使用tunet作为代号,完成所有工作。我们再也不用登录网费查询系统了。只需alt+ctrl+T调出terminal,输入tunet -q,就查询所有网费情况、流量使用明细等。是不是很炫酷。


2 import机制及使用:

因为有了多个.py文件,这就涉及到各个py文件之间的调用。

import是载入模块的关键字。我们可以import另一个脚本,并带全名地使用里面的函数。也可以from pytunet_query import function。区别在于前者需要全名,比如使用pytunet_query中的function方法,就需要pytunet_query.function();但后者可以直接用function()。

个人建议,尽量使用import而不要使用from...import,原因在于前者能够区分是本脚本的方法还是本脚本外的方法,这样有利于理清逻辑关系。


最后,将我的最终v1.2版本的清华大学联网助手python版实现代码放上来。

pytunet_query.py:

import sys, time, os
import urllib.request, hashlib, http.cookiejar
import codecs, re

query_login_url  = 'https://usereg.tsinghua.edu.cn/do.php'
user_info_url    = 'https://usereg.tsinghua.edu.cn/user_info.php'
online_state_url = 'https://usereg.tsinghua.edu.cn/online_user_ipv4.php'
query_logout_url = 'https://usereg.tsinghua.edu.cn/do.php'

info_header = [ '#' * 89,
				'#\t\t\t\tUser Flux Detail Infomation\t\t\t\t#',
				'#' * 89]

#########################################################
#					File I/O Modules					#
#########################################################

def create_path(relative_path):
 	base_path = os.path.abspath(os.path.dirname(sys.argv[0]))
 	return os.path.join(base_path, relative_path)

def write_inline(file_handler, contents):
	for line in contents:
		file_handler.write(line + '\r\n')

def save_query(contents):
	relative_path = 'USER_DETAIL_INFOMATION.LOG'
	file_handler = open(create_path(relative_path), 'w')
	write_inline(file_handler, info_header)
	file_handler.write('\t\t\t\tDatetime: ' + time.strftime('%Y-%m-%d %H:%M:%S') + '\r\n' + '-' * 89 + '\r\n')
	write_inline(file_handler, contents)
	file_handler.write('\r\n')
	file_handler.close()

#########################################################
#					Connection Modules					#
#########################################################

def create_opener():
	cookie = http.cookiejar.CookieJar()
	cookie_proc = urllib.request.HTTPCookieProcessor(cookie)
	return urllib.request.build_opener(cookie_proc)

def response_login(login_data):
	request_url = urllib.request.Request(query_login_url, login_data.encode())
	response_url = urllib.request.urlopen(request_url)
	return response_url.read().decode()

#########################################################
#				Main Login/Logout Modules				#
#########################################################

def query_login(username, password):
	hashcd_md5 = hashlib.md5()
	hashcd_md5.update(password.encode())
	tr_password = hashcd_md5.hexdigest()
	login_data = 'user_login_name=' + username + '&user_password=' + tr_password + '&action=login'
	urllib.request.install_opener(create_opener())
	answer = response_login(login_data)
	if answer == 'ok':
		return True
	else:
		return False

def query_logout():
	logout_data = 'action=logout'
	request_url = urllib.request.Request(query_logout_url, logout_data.encode())
	response_url = urllib.request.urlopen(request_url)
	print ('Your flux details and other infomations are saved in USER_DETAIL_INFOMATION.LOG under the SAME directory')

#########################################################
#				Data Post-Process Modules				#
#########################################################

def post_process(info):
	end_time = time.strftime('%Y-%m-%d')
	start_time = end_time[:8:] + '01'
	flux_detail_url = 'https://usereg.tsinghua.edu.cn/user_detail_list.php?action=balance2&user_login_name=&user_real_name=&desc=&order=&start_time=' + start_time + '&end_time=' + end_time + '&user_ip=&user_mac=&nas_ip=&nas_port=&is_ipv6=0&page=1&offset=200'	

	response_usr = urllib.request.urlopen(user_info_url)
	response_state = urllib.request.urlopen(online_state_url)
	response_details = urllib.request.urlopen(flux_detail_url)

	info = flux_account_query(info, response_usr)
	info = online_state_query(info, response_state)
	info = flux_detail_query(info, response_details)
	
	return info

#########################################################
#				Integrated Query Modules				#
#########################################################

flux_account_keys = ('用户名', '用户组', '姓名', '证件号', '当前计费组', '使用时长(IPV4)', '使用流量(IPV4)',
					 '使用时长(IPV6)', '使用流量(IPV6)', '帐户余额')
online_state_keys = ()
flux_detail_keys  = ()

#Auxiliary Function
def turn_key(key):
	if key[-5:-1] == 'byte':
		flux, unit = key.split('(')
		flux = float(flux) / 1024 / 1024
		new_key = '-->' + str(int(flux)) + '(MB)'
		key += new_key
	return key


def get_days(year, month):
	month_length = (31,28,31,30,31,30,31,31,30,31,30,31)
	month_length_leap = (31,29,31,30,31,30,31,31,30,31,30,31)
	if year % 400 == 0 or year % 100 != 0 and year % 4 == 0:
		return month_length_leap[month-1]
	else:
		return month_length[month-1]

def solve_flux(flux):
	unit = flux[-1]
	val = float(flux[:len(flux)-1:])

	if unit == 'B':
		val /= 1024 * 1024
	elif unit == 'K':
		val /= 1024
	elif unit == 'G':
		val *= 1024

	return int(val)

def trans_content(response):
	raw = response.read().decode('gb2312')
	raw = re.sub('<[^>]+>| |[\n\t]+|-->',' ',raw)
	raw = re.sub(' +', ' ', raw)
	return raw

def push_front(figure, line):
	tf = []
	tf.append(line)
	return tf + figure

def display_fluxAccount_onlineState(info):
	print()
	for line in info:
		if line[0] != '-':
			print(line)
		else:
			print()

def display_flux_detail(fluxin, year, month, day):
	maxflux = 0
	divide = 10
	figure = []
	for flux in fluxin:
		if flux > maxflux:
			maxflux = flux

	top = str(int(maxflux)) + 'MB|'
	length = len(top)
	mid = str(int(maxflux / 2)) + 'MB|'
	mid = ' ' * (length - len(mid)) + mid
	bottom = '0MB|'
	bottom = ' ' * (length - len(bottom)) + bottom
	unit = maxflux / divide

	for i in range(day):
		fluxin[i] = int(fluxin[i] / unit)

	for i in range(divide):
		line = ''
		if i == divide - 1:
			line = top
		elif i == int((divide - 1) / 2):
			line = mid
		elif i == 0:
			line = bottom
		else:
			line = ' ' * (length - 1) + '|'
		for j in range(day):
			if fluxin[j] > 0:
				line += '**'
				fluxin[j] -= 1
			else:
				line += '  '

		figure = push_front(figure, line)

	figure = push_front(figure, '**每日流量使用统计列表**')
	figure.append(' ' * length + '--' * day)
	date_front = str(year) + '-' + str(month) +'-' + '1'
	date_rear  = str(year) + '-' + str(month) +'-' + str(day)
	date_mid   = str(year) + '-' + str(month) +'-' + '15'
	figure.append(' %s\t\t\t%s\t\t\t%s' %(date_front, date_mid, date_rear))

	for line in figure:
		print(line)

	print()

#Integrated Query
def flux_account_query(info, response):
	info.append('**用户基本信息**')
	done = trans_content(response)
	match = re.search('用户名.*?(元) ', done)
	done = match.group()
	tlist = done.split(' ')
	line = ''

	for key in tlist:
		if line != '':
			key = turn_key(key)
			line = line + '\t: ' + key
			info.append(line)
			line = ''
		elif key in flux_account_keys:
			line = key

	info.append('-' * 89)
	return info

def online_state_query(info, response):
	info.append('**用户在线状态**')
	
	done = trans_content(response)
	match = re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.*\d{2}:\d{2}', done)

	if match == None:
		info.append('当前没有任何IP在线')
	else:
		info.append('在线IP地址\t登陆日期\t登陆时间')
		done = match.group()
		tlist = done.split(' ')
		line = ''
		count = 0

		for key in tlist:
			if count == 0:
				if re.search('\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}', key) != None:
					line = key
					count += 1
			elif count == 1:
				if re.search('\d{4}-\d{2}-\d{2}', key) != None:
					line += '\t' + key
					count += 1
			elif count == 2:
				if re.search('\d{2}:\d{2}:\d{2}', key) != None:
					line += '\t' + key
					info.append(line)
					line = ''
					count = 0

	info.append('-' * 89)
	display_fluxAccount_onlineState(info);
	return info

def flux_detail_query(info, response):
	info.append('**每日流量使用统计列表**')
	info.append('登出日期\t入流量\t出流量')
	done = trans_content(response)
	year, month = time.strftime('%Y %m').split(' ')
	days = get_days(int(year), int(month))
	tlist = done.split(' ')

	fluxin_perday = [0 for i in range(days)]
	fluxout_perday = [0 for i in range(days)]
	offline_date = True
	count = 0

	for key in tlist:
		if re.search('\d{4}-\d{2}-\d{2}', key) and offline_date:
			offline_date = False
		elif re.search('\d{4}-\d{2}-\d{2}', key) and not offline_date:
			offline_date = True
			year, month, day = key.split('-')
			iday = int(day)
		elif re.search('\d+[.]\d*[BKMG]', key) and count == 0:
			fluxin_perday[iday-1] += solve_flux(key)
			count += 1
		elif re.search('\d+[.]\d*[BKMG]', key) and count == 1:
			fluxout_perday[iday-1] += solve_flux(key)
			count += 1
		elif re.search('\d+[.]\d*[BKMG]', key) and count == 2:
			count = 0
	
	for i in range(days):
		if i + 1 < 10:
			d = '0' + str(i + 1)
		else:
			d = str(i + 1)
		info.append('%s\t%s\t%s' %(time.strftime('%Y-%m-') + d, str(fluxin_perday[i]) + 'MB', str(fluxout_perday[i]) + 'MB'))

	display_flux_detail(fluxin_perday, int(year), int(month), days)
	return info

#########################################################
#						Main Part						#
#########################################################

def tunet_query(username, password):
	print('FETCHING DATA FROM http://usereg.tsinghua.edu.cn, PLEASE WAIT FOR A MOMENT...')
	is_login = query_login(username, password)
	if is_login:
		info = []
		info = post_process(info)
		save_query(info)
		query_logout()
	else:
		print ('CAN\'T CAPTURE YOUR FLUX DATA, PLEASE TRY AGAIN LATER')

def pytunet_query():
	username = 'hhy14'
	password = '123456'
	tunet_query(username, password)

if __name__ == '__main__':
	pytunet_query()
pytunet_connect.py:

import time
import urllib.request, hashlib
import codecs

login_url  = 'http://net.tsinghua.edu.cn/cgi-bin/do_login'
logout_url = 'http://net.tsinghua.edu.cn/cgi-bin/do_logout'
check_url  = 'http://net.tsinghua.edu.cn/cgi-bin/do_login'
query_url  = 'https://usereg.tsinghua.edu.cn/login.php'

times_cnt = {1: 'FIRST', 2: 'SECOND', 3: 'THIRD', 4: 'FORTH', 5: 'FIFTH'}
ret_type  = {'logout_ok'       : 'LOGOUT SUCCESS',
			'not_online_error' : 'NOT ONLINE',
			'ip_exist_error'   : 'IP ALREADY EXISTS',
			'user_tab_error'   : 'THE CERTIFICATION PROGRAM WAS NOT STARTED',
			'username_error'   : 'WRONG USERNAME',
			'user_group_error' : 'ACCOUNT INFOMATION INCORRECT',
			'password_error'   : 'WRONG PASSWORD',
			'status_error'     : 'ACCOUNT OVERDUE, PLEASE RECHARGE',
			'available_error'  : 'ACCOUNT HAS BEEN SUSPENDED',
			'delete_error'     : 'ACCOUNT HAS BEEN DELETED',
			'usernum_error'    : 'USERS NUMBER LIMITED',
			'online_num_error' : 'USERS NUMBER LIMITED',
			'mode_error'       : 'DISABLE WEB REGISTRY',
			'time_policy_error': 'CURRENT TIME IS NOT ALLOWED TO CONNECT',
			'flux_error'       : 'FLUX OVER',
			'ip_error'         : 'IP NOT VALID',
			'mac_error'        : 'MAC NOT VALID',
			'sync_error'       : 'YOUR INFOMATION HAS BEEN MODIFIED, PLEASE TRY AGAIN AFTER 2 MINUTES',
			'ip_alloc'         : 'THE IP HAS BEEN ASSIGNED TO OTHER USER'
			}

version  = '1.2'
sleep_time = 8

#########################################################
#				Main Login/Logout Modules				#
#########################################################

def trans_content(response):
	content = response.read().decode()
	ret = ''
	for ch in content:
		if ch.isalpha() or ch == '_':
			ret += ch
	return ret

def tunet_login(username, password):
	hashcd_md5 = hashlib.md5()
	hashcd_md5.update(password.encode())
	tr_password = hashcd_md5.hexdigest()
	login_data = 'username=' + username + '&password=' + tr_password + '&drop=0&type=1&n=100'
	login_data = login_data.encode()
	request_url = urllib.request.Request(login_url, login_data)
	response_url = urllib.request.urlopen(request_url)
	ret = trans_content(response_url)
	print (ret_type.get(ret, 'CONNECTED'))
	return ret

def tunet_logout():
	response_url = urllib.request.urlopen(logout_url)
	ret = trans_content(response_url)
	print (ret_type.get(ret, 'CONNECTED'))
	return ret

def tunet_check():
	check_data = 'action=check_online'
	check_data = check_data.encode()
	request_url = urllib.request.Request(check_url, check_data)
	response_url = urllib.request.urlopen(request_url)
	ret = trans_content(response_url)
	if ret == '':
		print ('NOT ONLINE')
	else:
		print (ret_type.get(ret, 'CONNECTED'))
	return ret

#########################################################
#					Help&Version Modules				#
#########################################################

def tunet_help():
	print ('-h, --help   : show all options of Tsinghua University Internet Connector')
	print ('-v, --version: show version of Tsinghua University Internet Connector')
	print ('-u           : input your username after \'-u\'')
	print ('-p           : input your password after \'-p\'')
	print ('-a           : enter username and password later, you can login other campus network account')
	print ('-i, --login  : login operation')
	print ('-o, --logout : logout operation')
	print ('-c, --check  : check the internet')
	print ('-q, --query  : query basic infomation, online state and flux usage details')

def tunet_version():
	print ('Tsinghua University Internet Connector ', version)

def tunet_others():
	print ('UNKNOWN OPTIONS')
	print ('WHICH OPTION DO YOU WANT?')
	tunet_help()
	print ('IF ANY ERROR, PLEASE CONTACT im@huhaoyu.com.')

#########################################################
#						Main Part						#
#########################################################

def tunet_connect(username, password):
	ret = 'ip_exist_error'
	for count in range(5):
		print ('%s attempts to connect...' % times_cnt.get(count + 1))
		if ret != tunet_login(username, password):
			break
		if count == 4:
			print ('please try to reconnect after 1 minute')
			break
		print ('try to reconnect after %s seconds' %sleep_time)
		time.sleep(sleep_time)
		print ()
pytunet.py:

#########################################################
#						Welcome							#
#	Tsinghua University Internet Connector in Python	#
#					 Version: v1.2 						#
#					Date: 2015/04/05					#
#			By: Haoyu hu	Email: im@huhaoyu.com		#
#			Address: Tsinghua University				#
#########################################################

import pytunet_connect
import pytunet_query
import sys, getopt, getpass, os, re

def pytunet():
	relative_path = 'USERNAME_PASSWORD.txt'
	file_handler = open(pytunet_query.create_path(relative_path), 'r')
	lines = file_handler.readlines()
	if len(lines) != 2:
		print('%s IS DAMAGED, PLEASE CHECK THE CONTENT FORMAT IN THE FILE:' %relative_path)
		print('CONTENT FORMAT AS FOLLOWS:')
		print('username=huhy14\npassword=123456')
		exit(1)
	username = re.sub('\s', '', lines[0])
	password = re.sub('\s', '', lines[1])
	_, username = username.split('=')
	_, password = password.split('=')
	file_handler.close()

	try:
		options, args = getopt.getopt(sys.argv[1:], 'achiop:qu:v', ['help', 'login', 'logout', 'check', 'version', 'query'])
	except getopt.GetoptError:
		pytunet_connect.tunet_others()
		sys.exit(1)

	want_login = False
	want_query = False
	flag = False

	name, value = None, None

	for name, value in options:
		if name in ('-h', '--help'):
			pytunet_connect.tunet_help()
			sys.exit(0)
		elif name in ('-v', '--version'):
			pytunet_connect.tunet_version()
			sys.exit(0)
		elif name == '-a':
			flag = True
		elif name == '-u':
			username = value
		elif name == '-p':
			password = value
		elif name in ('-i', '--login'):
			want_login = True
		elif name in ('-o', '--logout'):
			pytunet_connect.tunet_logout()
			sys.exit(0)
		elif name in ('-c', '--check'):
			pytunet_connect.tunet_check()
			sys.exit(0)
		elif name in ('-q', '--query'):
			want_query = True

	if flag:
		username = input('username: ')
		password = getpass.getpass('password: ')
		print (password)

	if want_query:
		pytunet_query.tunet_query(username, password)

	if want_login or not want_query and not want_login:
		pytunet_connect.tunet_connect(username, password)

	# if not want_query and not want_login:
	# 	print ('WARNING: YOU JUST DIDN\'T DO ANYTHING! IF YOU WANT TO CONNECT TO THE CAMPUS NETWORK, THE COMMAND MUST INCLUDE -i OR --login')
	# 	print()
	# 	pytunet_connect.tunet_help()

if __name__ == '__main__':
	pytunet()

实际使用:


如分析或代码有误,请批评指正,谢谢!

Linux服务器Python环境搭建全攻略:从零配置到Web服务部署 Python作为广泛应用于Web开发、数据分析和自动化脚本的编程语言,其环境配置是开发者必须掌握的基础技能。在Linux服务器上搭建Python环境,核心在于理解系统包管理、虚拟环境隔离和依赖管理三大原理。通过虚拟环境技术,可以为每个项目创建独立的依赖空间,有效解决库版本冲突问题,保障项目的可复现性和稳定性。这一技术实践对于部署需要24小时运行的自动化脚本、聊天机器人或网站后台等应用场景至关重要。本指南以Ubuntu系统为例,详细解析了从SSH登录、Python安装、虚拟环境配置到使用pip管理第三方库的完 阅读详情

相关推荐

Python SSL证书验证全解析:从原理到实战解决CERTIFICATE_VERIFY_FAILED

SSL/TLS证书是保障网络通信安全与可信的基石,它通过非对称加密和数字签名技术,在客户端与服务器之间建立加密通道并验证身份。其核心原理基于信任链模型,由受信任的根证书机构层层签发,确保通信双方的真实性。在Python开发中,正确处理SSL证书验证对网络请求、依赖安装和应用部署至关重要,直接关系到脚本的稳定运行和生产环境的安全性。开发者常遇到的CERTIFICATE_VERIFY_FAILED错误,通常源于本地信任链不完整、证书过期或企业代理拦截等场景。通过系统更新根证书、维护certifi包等工程实践,可

weixin_30776545的博客 445

在Linux服务器上使用清华镜像安装Python第三方依赖包

在Linux服务器上使用清华镜像安装Python第三方依赖包

Leon_Jinhai_Sun的博客 1499

Python全系列安装教程:从解释器到IDE的完整环境配置

Python安装并非简单下载执行,而是涉及解释器、pip包管理器与虚拟环境三者协同的基础工程。其核心原理在于环境变量PATH的路径检索机制、pip对PyPI源的HTTP协议调用,以及venv基于进程隔离的依赖沙盒设计。这一技术链直接决定后续代码能否正常导入模块、运行爬虫或加载数据科学库。典型应用场景包括零基础入门配置、PyCharm/VS Code开发环境搭建、跨版本项目隔离及国内网络下的高效依赖安装。本文聚焦Windows主流平台实操,同步覆盖macOS与Ubuntu关键差异,提供可复用的环境验证命令与故

weixin_34184158的博客 339

Linux常用命令

Linux命令格式 文件目录操作命令 ls文件目录操作命令 cd 文件目录操作命令 cat 文件目录操作命令 more 文件目录操作命令 tail 文件目录操作命令 mkdir 文件目录操作命令 rmdir 文件目录操作命令 rm 拷贝移动命令 cp 拷贝移动命令 mv 打包压缩命令 tar 文本编辑命令 vi/vim 文本编辑命令 vim 查找命令 find 查找命令 grep Linux命令使用技巧 乱码解决

qq_51810428的博客 2018

AI编程助手高可用实践:Claude宕机时无缝切换Grok与本地化部署

AI编程助手已成为提升开发效率的核心工具,其工作原理是通过API或本地模型对代码进行智能分析与生成。在工程实践中,服务的高可用性是保障开发流程顺畅的关键技术价值。当依赖的云端服务(如Claude API)出现不稳定或宕机时,会直接影响开发效率。因此,构建包含本地化部署和备用方案的混合架构,成为应对服务中断的重要应用场景。本文聚焦于通过配置管理、故障排查和熔断策略,实现从Claude到Grok等备用方案的平滑切换,确保开发辅助环境的持续可用性。其中,涉及对Claude Code的API配置、Grok的本地部署

weixin_34252090的博客 472

Linux运维基石:YUM源配置全解析与实战指南

在Linux系统管理中,软件包管理是核心基础,它负责软件的搜索、安装、升级和依赖解决。其原理是通过配置软件仓库(Repository)源,系统便能从指定位置获取并管理软件包。这项技术的核心价值在于构建稳定、高效的软件供应链,直接决定了后续服务部署、环境搭建的成败。无论是部署Web服务、数据库,还是搭建开发环境,都依赖于正确的源配置。在实际应用场景中,根据网络环境和需求,主要分为本地YUM源和网络YUM源。本地源基于ISO镜像或内部服务器,适用于无外网、批量部署等离线可控场景;而网络源则连接互联网镜像站(如阿

weixin_33695450的博客 344

Python 使用清华大学镜像源

官方地址 首先,如果只是临时下载一个包 那么可以使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 要下的包名 如果是永久修改镜像源 pip install pip -U pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 如果网络不好...

liuYinXin的博客 13万+

Linux系统yum源配置详解:从原理到实战更换国内镜像

在Linux系统中,软件包管理器是系统生态的核心组件,负责软件的查找、安装、更新与依赖管理。以红帽系发行版为例,yum作为默认包管理器,其工作原理是通过读取仓库配置文件,获取元数据并解析依赖关系,最终完成软件包的下载与安装。这一机制的技术价值在于实现了软件管理的自动化与标准化,极大提升了系统维护效率。然而,默认的国外软件仓库常因网络延迟导致下载速度缓慢、连接不稳定,直接影响开发部署流程。为此,将yum源更换为国内镜像站(如阿里云、清华大学源)成为提升Linux使用体验的关键实践。通过配置本地源或管理多个仓库

cigang4063的博客 566

centos下python2和python3的pip设置,区分pip2和pip3

上一篇文章已经讲述了如何在centos服务器下载python3,并且和centos自带的python2不冲突。 启动python2,我们可以直接在命令行输入:python2 启动python3,我们可以在命令行输入:python或者python3. 但是pip没有设置的话,在命令行输入 pip --version 或者 pip2 --version,指向的都是python2. 现在我们...

大蛇王的博客 8172

Python虚拟环境与pip包管理实战指南:从报错诊断到生产部署

Python虚拟环境和pip包管理是保障项目可复现性与依赖隔离的基础能力。其核心原理在于通过路径隔离(site-packages、Scripts/bin)、环境变量劫持(PATH)及元数据解析(PyPI JSON API)构建进程级沙盒。技术价值体现在避免系统污染、支持多版本共存、提升CI/CD稳定性,并为Docker容器化与灰度发布提供原子切换基础。典型应用场景包括新手环境初始化、Web爬虫工程化、机器学习CUDA环境适配,以及VSCode/PyCharm解释器绑定失效排查。本文聚焦virtualenv与

weixin_34166472的博客 314

Fedora Linux 桌面系统全攻略:从安装配置到开发环境搭建

Linux 操作系统作为开源生态的核心,其发行版的选择与配置是开发者和技术爱好者必须掌握的基础技能。理解不同发行版的设计哲学与软件包管理机制,是构建稳定高效开发环境的关键。Fedora Linux 以其前沿的软件生态与严谨的发布流程,在创新性与稳定性之间取得了良好平衡,为现代软件开发与日常办公提供了可靠的技术底座。通过 DNF 包管理器、RPM Fusion 第三方仓库以及 Flatpak 通用包格式,用户可以便捷地管理从系统工具到桌面应用的全栈软件。本文以 Fedora Workstation 为例,详细

chunchan1381的博客 439

Linux系统yum源配置全攻略:从原理到实践,加速软件包管理

在Linux系统管理中,软件包管理是基础且核心的技术环节,它直接关系到系统的稳定性和开发运维效率。其原理是通过仓库(Repository)机制集中管理软件包及其依赖关系,实现自动化安装与更新。这一技术价值在于解决了手动处理依赖的复杂性,提升了系统部署和维护的自动化水平。在Red Hat系发行版(如CentOS、RHEL、Rocky Linux)中,yum(及其下一代dnf)是实现这一功能的关键工具。然而,默认官方源常因网络延迟影响使用体验,因此配置高效、稳定的镜像源成为重要的工程实践。应用场景广泛,从个人开

weixin_33720956的博客 422

PyCharm虚拟环境pip报错:从原理到根治的完整指南

虚拟环境是Python开发中实现项目依赖隔离的核心机制,它通过创建独立的Python运行环境,避免不同项目间的包版本冲突。其工作原理主要基于环境变量PATH的优先级调整,将虚拟环境的可执行文件目录置于系统路径之前。这一技术对于保证项目可复现性和团队协作一致性具有重要价值,广泛应用于Web开发、数据科学和机器学习等场景。然而,在PyCharm等IDE中,虚拟环境与系统环境的交互常因环境变量配置问题引发冲突,典型表现就是pip命令执行失败。本文聚焦于PyCharm终端中常见的'Try to run this c

weixin_30550081的博客 348

python学习笔记

1)语法class 类名:“”“类说明文档”“”类体类名一般使用大驼峰命名法。类体中可以包含类属性(也叫类变量)、方法、实例属性(也叫实例变量)等。并非必须在类定义中进行方法定义,也可以将一个函数对象赋值给一个类内局部变量。#类外定义的函数class C:f = f1Python是一门解释型语言,只有在程序运行后才会执行语法检查。所以,只有在运行或测试程序时,才会真正知道该程序能不能正常运行。Python有两种错误很容易辨认:语法错误和异常。

dangerouszzz的博客 1003

TsinghuaNet:清华大学校园网客户端与联网库,适用于命令行环境,Windows,Linux,Mac OS X桌面平台与UWP,iOS,Android移动平台

清华网 清华大学校园网联网库与客户端。 这个项目已经完成,进入维护阶段。 官方资源 项目介绍 清华网 联网库,和一些其他项目需要的辅助类。支持.NET Standard 2.0,.NET Standard 2.1和.NET 5.0。 清华网 提供了C / C ++接口的本地库。 清华网 命令行版本,支持.NET Core 5.0,并针对Windows x64,Linux x64,Mac OS X x64的AOT版本。 清华网 Eto.Forms版本。支持Windows,Linux和Mac OS桌面平台。 平台 视窗 Linux 苹果系统 实现 框架 .NET Core / .NET Fram

linux安装pymongo,命令行可import,代码中报错

解决在linux中安装pymongo,命令行可import,代码中报错

Python 3.10安装PyQt5全攻略:从ABI兼容到实战排错

Python扩展模块的安装本质上是解决二进制兼容性问题,特别是涉及C/C++绑定的库。其核心原理在于Python的应用程序二进制接口(ABI)在不同版本间可能发生变化,导致为旧版本预编译的二进制轮子无法在新环境中直接运行。这一机制的技术价值在于保证了Python生态的稳定性和扩展性,使得开发者能够无缝利用高性能的底层库。在GUI开发、数据可视化等应用场景中,PyQt5作为Qt框架的Python绑定,是构建跨平台桌面应用的重要工具。本文聚焦于在Python 3.10这一特定版本上,如何系统性地解决PyQt5的

benben 521

从零到精通:ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程

本文详细介绍了ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程,从环境准备到高级功能扩展,帮助开发者实现精准控制。通过集成模型预测控制(MPC),机械臂能够优化复杂轨迹规划,处理动态避障,提升工业自动化效率。

juice的博客 705

优化Python开发:通过镜像源与pip-tools提升pip依赖管理效率

在Python开发中,依赖管理是构建稳定、可复现开发环境的基础。其核心原理是通过包管理工具解析并安装项目所需的第三方库。高效管理依赖的技术价值在于显著提升开发效率、保障环境一致性并节省网络与存储资源。常见的应用场景包括个人项目搭建、团队协作、CI/CD流水线以及离线环境部署。本文聚焦于通过配置国内镜像源加速下载,并结合pip-tools等工具实现依赖的精确锁定与同步,从而自然收敛到对原生pip工作流的轻量级增强方案,有效解决网络慢、依赖混乱等常见问题。

weixin_30606461的博客 339

无人机飞控算法开发实战:从零到一构建企业级飞控系统

本文系统介绍了无人机飞控算法开发的完整流程,包括飞行动力学模型建立、传感器校准与数据融合、主流控制算法实现(PID、ADRC、EKF)以及企业级飞控系统架构设计。通过结合开源飞控框架(如PX4)和实际工程经验,提供了完整的代码实现示例,帮助学者从零开始掌握无人机飞控开发的核心技术。文中详细讲解了四旋翼无人机的动力学模型、传感器校准方法、EKF状态估计算法、PID和ADRC控制算法的实现,以及MAVLink通信协议的集成。最后,总结了完整的飞控系统开发流程和未来发展趋势。

全栈 3401

【自动驾驶端到端5:VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning】

从大规模人类驾驶演示中学习类人驾驶策略是有希望的。但是,规划的不确定性使得从驾驶演示中提取驾驶知识是有挑战性的。从统计学习的角度来看,动作(包括实际和速度)是高度随机的,受许多无法建模的潜在因素影响。

weixin_40000560的博客 1404
上一篇: python实现清华大学联网助手(二)——正则表达式re/网页跳转/cookiejar
下一篇: Leetcode-Number of Islands
coderhuhy
博客等级 码龄12年 24粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值