1、在安装任何软件之前都要先查看本机是否已经安装,以及对应版本。
2、Anaconda在进行 conda update --all
指令时,并不会将所有包都更新到最新版本。
后来通过conda update
文件查到,“此命令接受包名称列表,并将它们更新为与环境中所有其他包兼容的最新版本。” 这意味着如果conda update
指令在进行某个软件包的更新,此时可能会使其他软件包的稳定性受到威胁,则不会更新这些软件包。因此,conda update -all
会优先考虑稳定性而不是最近的构建。而conda update numpy
优先考虑numpy
更新,不考虑整体稳定性。
3、PATH是路径的意思,PATH环境变量中存放的值,就是一连串的路径。不同的路径之间,用英文的分号(;)分隔开。系统执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件、批处理文件(另外一种可以执行的文件)等。若找不到,再依次在PATH保存的这些路径中寻找相应的可执行的程序文件。系统就以第一次找到的为准;若搜寻完PATH保存的所有路径都未找到,则会显示不是内部或外部命令,也不是可运行的程序。
4、内部命令和外部命令是DOS(Disk Operating System,微软早期基于命令行的操作系统)时代的概念。内部命令是随每次启动的COMMAND_COM装入并常驻内存,而外部命令是一条单独的可执行文件。粗略地讲,所谓内部命令就是最核心、使用最多的命令。为了提高响应速度,系统一启动,这些命令就被加载到内存,因此可以迅速、直接地执行;而外部命令由于使用相对较少,就不预先加载到内存,当用户使用时,再到硬盘上(C:\windows\system32)找相应的可执行文件,然后加载到内存执行。像dir、cd等都是内部命令,而诸如attrib、format等都是外部命令。尽管DOS的时代早已成为了历史,但某些操作却必须在命令行模式下完成,对专业人士来说更是如此。因此,Windows产品一直保留着命令行模式这个工具。
5、批处理文件(后缀名为.bat,来源于批量的英语单词batch),它是另外一种可以执行的文件。简单地说,批处理文件包含了很多DOS命令。文件执行时,就一条一条地执行这些命令。不一定顺序执行,像通用的程序设计语言一样,它也有自己的流程控制。批处理文件创建很简单:用任何一个文本编辑器(如Windows的记事本)创建一个文本文件,然后把后缀名改为.bat即可。创建好的批处理文件,你也可以用文本编辑器打开,查看它的“源代码”。
6、wkhtmltopdf在代码中已经配置了路径,但程序运行仍然找不到的问题。
- 下载wkhtmltopdf安装包,并且安装到电脑上,同时配置环境变量。
- 在pycharm中安装wkhtmltopdf库:
pip install wkhtmltopdf
- 在代码中指定configuration参数。
7、在Pycharm中首次授权GitHub Copilot步骤:
- 要先科学上网。
- 依次点击设置>网络与Internet>代理>手动设置代理>设置,记下IP代理地址和端口。
- 进入Pycharm,依次点击右上角小齿轮>设置>外观与行为>系统设置>HTTP代理,选择手动代理配置>HTTP,填入主机名和端口号,点击确定。
- 点击右下角驾驶员小图标,Login to Github。或者依次点击左上角四条杠>工具>Github Copilot>Login to Github。
- 复制机器码并进入GitHub页面授权。授权成功就可以使用了,使用时无需科学上网。
8、Git连不上GitHub问题
一直报错:git@github.com: Permission denied (publickey).
则在git中输入:
ssh-agent -s
ssh-add /d/Git/.ssh/id_rsa
如果报错:Could not open a connection to your authentication agent.
就继续输入:
ssh-agent bash
ssh-add /d/Git/.ssh/id_rsa
*/d/Git/.ssh/id_rsa是我安装公钥的地址。
9、上传GitHub时,文件名必须是英文。
10、将Python程序打包成exe时,图标图片要转换成ico格式,并与.py文件放在同一个目录下。
如果在运行exe时报错缺少某个库,可以用打包命令“–hidden-import=”,将缺少的库指名打包进去。
-F: 打包成一个exe文件
-w: 不带console输出控制台,window窗体格式
*对于-w要特别说明一点,当程序中存在输出内容时,tkinter库可以在GUI中显示内容,但是当程序运行量非常大时,会卡顿,所以还是去掉-w,老老实实在命令行输出或交互。
例如:
- 用管理员身份进入.py文件所在文件夹,
cd D:\JetBrains\pythonProjects\提取私募基金重要产品要素_PDF版\打包 - 输入打包指令,
pyinstaller -F -w -i spider.ico 提取私募基金重要产品要素_PDF版.py --hidden-import=lxml
11、ArkTS报错记录
1)08-17 20:00:46.108 12904-23244 C03f00/ArkCompiler
E [ArkRuntime Log] TypeError:
@Component ‘@Component ‘StandardDialog’[11]’: Illegal variable value error with decorated variable undefined ‘onConfirm’: failed validation: 'undefined, null, number, boolean, string, or Object but not function, not V3 @observed / @track class, attempt to assign value type: ‘function’, value: ‘undefined’!
ArkTS
1、垂直和水平排列
(1)垂直排列 - 使用 Column 组件:
Column() {
Text(‘第一行’)
Text(‘第二行’)
Text(‘第三行’)
}
.width(‘100%’)
.alignItems(HorizontalAlign.Center) // 控制子项在水平方向上的对齐
.justifyContent(FlexAlign.Start) // 控制子项在垂直方向上的对齐
(2)水平排列 - 使用 Row 组件:
Row() {
Text(‘左边’)
Text(‘中间’)
Text(‘右边’)
}
.width(‘100%’)
.alignItems(VerticalAlign.Center) // 控制子项在垂直方向上的对齐
.justifyContent(FlexAlign.SpaceBetween) // 控制子项在水平方向上的分布
(3)使用Stack组件:
// 只指定堆叠内容靠左对齐,垂直方向默认从底部开始
Stack({ alignContent: Alignment.Bottom }) {
}
// 明确指定堆叠内容从顶部开始,靠左对齐
Stack({ alignContent: Alignment.TopStart }) {
}
// 只指定堆叠内容靠左对齐,垂直方向默认从顶部开始
Stack({ alignContent: Alignment.Start }) {
}
2、拷贝
(1)浅拷贝
使用展开运算符(推荐):
BList = […AList]
使用数组的 slice() 方法:
BList = AList.slice()
使用循环方式:
AList.forEach(item => {
BList.push(item);
});
(2)深拷贝
BList = AList
3、内部组件分布间距
可以使用 justifyContent 属性来实现 Row/Column 中的均匀分布
.justifyContent(FlexAlign.SpaceBetween) // 项目之间保持相等间距,两端贴边
.justifyContent(FlexAlign.SpaceAround) // 项目之间保持相等间距,两端间距是中间间距的一半
.justifyContent(FlexAlign.SpaceEvenly) // 所有间距完全相等,包括两端
4、
一旦你在函数的任何路径中使用了显式 return,就必须确保所有可能的执行路径都有显式返回值。
5、indexOf是对象的引用
/**
* Returns the index of the first occurrence of a value in an array, or -1 if it is not present.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
*/
indexOf(searchElement: T, fromIndex?: number): number;
// 演示对象引用比较问题
const obj1 = {fundcode: ‘000001’, fundname: ‘某基金’};
const obj2 = {fundcode: ‘000001’, fundname: ‘某基金’};
obj1 === obj2; // false
[obj1].indexOf(obj2); // -1
对于对象,indexOf比较的是引用地址而非内容。
在进行对象的比较时,使用唯一标识符比较,即上面例子中的fundcode等。
6、在 EntryAbility 中可以直接使用 this.context,这是鸿蒙系统的设计。
1)this.context 的本质
它是UIAbility的内置属性:
export default class EntryAbility extends UIAbility {
// 🔥 UIAbility基类中已经定义了context属性
// 无需手动定义,可以直接使用
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 🔥 this.context 是从UIAbility基类继承来的
console.log(‘Context类型:’, typeof this.context)
console.log(‘Context对象:’, this.context)
// 直接使用
tztZFHsSDK.initial(this.context)
}
}
2)Context的类型和来源
查看UIAbility基类定义:
// UIAbility基类的简化定义
export class UIAbility {
// 🔥 系统自动注入的context属性
context: UIAbilityContext
// 生命周期方法
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {}
onDestroy(): void {}
// …其他方法
}
具体的Context类型:
// this.context 的实际类型是 UIAbilityContext
import { common } from ‘@kit.AbilityKit’
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 🔥 this.context 的类型是 UIAbilityContext
const ctx: common.UIAbilityContext = this.context
console.log('Context信息:')
console.log('- bundleName:', ctx.bundleName)
console.log('- moduleName:', ctx.moduleName)
console.log('- abilityName:', ctx.abilityName)
console.log('- filesDir:', ctx.filesDir)
console.log('- cacheDir:', ctx.cacheDir)
}
}
3)Context的能力和用途
UIAbilityContext提供的功能:
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 🔥 应用信息
console.log(‘应用包名:’, this.context.bundleName)
console.log(‘模块名:’, this.context.moduleName)
// 🔥 文件路径
console.log('文件目录:', this.context.filesDir)
console.log('缓存目录:', this.context.cacheDir)
console.log('临时目录:', this.context.tempDir)
// 🔥 启动其他Ability
// this.context.startAbility(want)
// 🔥 获取资源管理器
const resourceManager = this.context.resourceManager
// 🔥 数据库操作
// this.context.databaseDir
// 🔥 用于SDK初始化
tztZFHsSDK.initial(this.context)
}
}
4)为什么SDK需要Context?
SDK使用Context的目的:
-
获取应用信息:包名、版本号等
-
文件存储:缓存统计数据到本地
-
网络权限:检查网络状态
-
设备信息:获取设备标识符
-
生命周期管理:监听应用前后台切换
// SDK内部可能的使用方式(示例)
class AppLog {
init(context: Context, config: InitConfig) {
// 🔥 获取应用信息
this.appInfo = {
bundleName: context.bundleName,
versionName: context.versionName,
// …
}// 🔥 设置缓存目录
this.cacheDir = context.cacheDir + ‘/applog’// 🔥 获取设备信息
this.deviceInfo = this.getDeviceInfo(context)// 🔥 监听应用生命周期
context.on(‘applicationForeground’, this.onForeground)
context.on(‘applicationBackground’, this.onBackground)
}
}
5)不同场景下的Context获取
- 在UIAbility中:
// ✅ 直接使用this.context
export default class EntryAbility extends UIAbility {
onCreate() {
const ctx = this.context // UIAbilityContext类型
}
} - 在Page页面中:
// ✅ 需要使用getContext()获取
@Entry
@Component
struct Index {
aboutToAppear() {
const ctx = getContext(this) as common.UIAbilityContext
}
} - 在普通TypeScript类中:
// ❌ 无法直接获取context
class MyService {
init() {
// 需要从外部传入context
// const ctx = ??? // 无法获取
}
}
// ✅ 通过参数传入
class MyService {
init(context: common.UIAbilityContext) {
// 使用传入的context
}
}
总结
this.context 是鸿蒙系统的设计特性:
🎯 自动注入:UIAbility基类自动提供context属性
🎯 类型明确:类型是UIAbilityContext
🎯 功能丰富:提供应用信息、文件路径、生命周期等能力
🎯 SDK必需:火山引擎SDK需要context来获取应用环境信息
可以在EntryAbility中直接使用this.context的原因——它是系统框架提供的内置能力,不需要手动定义。