Conda 环境下pip版本冲突不一致问题

核心原理

Conda 环境激活后,终端会优先使用环境内的pythonpip。如果pip仍指向系统版本,说明环境内的pip缺失或路径被覆盖,需要修复环境内的pip关联。

以下用ping-pong-web举例子。

解决步骤

1. 确保已激活目标 Conda 环境

首先确认你在正确的环境中操作(终端提示符有ping-pong-web标识):

conda activate ping-pong-web

2. 检查 Conda 环境内的pip是否存在

Conda 环境中默认会安装pip,但可能被误删或未安装。执行以下命令检查环境内的pip路径:

which pip  # Linux/Mac
# 或 Windows: where pip
  • 正常情况:输出应包含conda/envs/ping-pong-web/bin/pip(Linux/Mac)或conda/envs/ping-pong-web/Scripts/pip.exe(Windows),表示使用环境内的pip
  • 异常情况:输出如/home/bruce/.local/lib/python3.12/site-packages/pip(你的情况),说明使用的是系统或用户目录的pip,而非环境内的。

3. 修复环境内的pip

如果环境内没有pip,或pip关联错误,用conda重新安装环境内的pip

# 先卸载环境内可能存在的异常pip(如果有)
conda remove --force pip -n ping-pong-web

# 重新在当前环境安装pip(确保已激活环境)
conda install pip

这一步会在ping-pong-web环境中安装与 Python 3.9.25 匹配的pip

4. 清理用户目录下的全局pip(关键!)

你的pip指向了/home/bruce/.local/lib/python3.12/,这是用户级别的全局安装路径(可能是之前用pip install --user安装的),优先级可能覆盖了 Conda 环境的pip。需要清理:

# 删除用户目录下的pip(注意路径与你的输出对应)
rm -rf /home/bruce/.local/lib/python3.12/site-packages/pip*
rm -rf /home/bruce/.local/bin/pip*

注意:替换路径为你pip --version输出中的路径(确保不要删除系统关键文件)。

2025年流行的Python部署

传统的真机Python+pip部署方式早已被淘汰了。

而venv虚拟部署的方式还有很多人在用,也确实比传统真机部署好很多,但也再被渐渐淘汰。

目前较为流行的一种模式是:Conda+UV的组合方式。

conda:核心是环境管理工具,负责创建隔离的虚拟环境(可包含不同 Python 版本、系统级依赖甚至非 Python 包,如 C 库)。

uv:核心是Python 包管理器,专注于快速安装 / 管理 Python 包(类似 pip,但速度更快、依赖解析更高效),本身不管理环境,而是依赖于当前激活的 Python 环境。

建议在激活 conda 环境后安装 uv,避免全局安装导致的环境混淆。

pip install uv

uv的使用例子:

uv pip install transformers==4.24.0  # 安装指定版本
uv pip uninstall jieba  # 卸载包
uv sync  # 同步依赖(根据 pyproject.toml 或 requirements.txt)

注意事项(避免潜在问题):

1、不混用 conda 和 uv 安装同一 Python 包

例如,不要用 conda install pandas 后再用 uv pip install pandas,可能导致版本冲突(conda 和 pip/uv 管理的包路径虽然一致,但依赖解析逻辑不同)。

  • 优先用 uv 管理纯 Python 包(如 transformersjieba);
  • conda 管理含系统依赖的包(如 numpyopencv,conda 会自动安装对应的 C 库)。

2、uv 不处理非 Python 依赖

uv 仅负责 Python 包,若包依赖系统级库(如 libssllibffi),仍需通过 conda 或系统包管理器(apt)安装:

# 例如安装需要系统库的包,先用 conda 安装依赖 conda install -c conda-forge libsndfile # 安装音频处理的系统库 uv pip install soundfile # 再用 uv 安装依赖该库的 Python 包

3、环境迁移时需同步两者的配置

若要复制 conda 环境,除了用 conda env export,还需同步 uv/pip 管理的包(通过 uv pip freeze > requirements.txt 导出)。

总结

uvconda 是互补工具:conda 负责环境隔离和系统级依赖,uv 负责高效管理 Python 包,在 conda 环境中使用 uv 不仅安全,还能显著提升包安装速度,推荐结合使用。

国内使用建议:

/.config/uv/uv.toml
index-url = “https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple”

另外,uv也是可以直接运行py文件的。如图所示。

关于用Suno生成歌曲的若干疑问解答

我可以将我的歌曲分发到 Spotify 等平台吗?

  • 是的!如果您在订阅 Pro 或 Premier 计划期间创作了歌曲,这些歌曲受商业使用许可的保护,允许您进行分发。

Suno 拥有我创作的音乐吗?

  • 如果您在歌曲创作时订阅了 Pro 或 Premier 计划,您将被视为歌曲的所有者,并保留商业使用权。如果您使用免费(Basic)版本,Suno 保留歌曲的所有权,但您可以将其用于非商业目的。

取消订阅后谁拥有我的歌曲?

  • 如果您在订阅期间创作了歌曲,即使取消订阅,您仍保留该歌曲的权利。这意味着您可以在结束订阅后分发这些歌曲。

什么是商业用途或非商业用途?

  • Basic 计划允许您创作歌曲用于非商业用途,而使用 Pro 和 Premier 计划创作的歌曲则包括商业用途。

如果我订阅了,可以分发免费计划中的歌曲吗?

  • 不幸的是,不可以!订阅 Pro 或 Premier 计划不会追溯性地授予您免费计划中创作歌曲的商业使用许可。

我对我创作的歌曲拥有版权吗?

  • 版权是复杂的,并且因地区而异!为了确保您拥有最新信息,我们建议您在申请前咨询当地的版权局。

我可以在我所在地区的版权局注册我的歌曲吗?

  • 版权法可能因地区而异,并且人工智能创作作品的版权规则仍在完善中。因此,我们建议…(具体建议请参考原文)

如果我有一个免费计划但自己写了歌词怎么办?

  • 如果您自己写了在 Suno 中创作的歌曲的歌词,您拥有这些歌词。无论您使用哪种计划,歌词都属于您。

如果我的歌曲中别人写了歌词怎么办?

Suno 最适合创作带有新歌词的新音乐。如果您与另一位创作者合作,您必须获得任何歌词或其他材料的许可。

探索 Dialogic 2:游戏对话与叙事的得力助手

在游戏开发领域,引人入胜的对话系统和精彩的叙事常常能为游戏增色不少,成为吸引玩家深入体验的关键因素。而 Dialogic 2,正是一款专为游戏开发者打造的强大插件,能助力开发者轻松实现复杂且生动的游戏对话与叙事。

Dialogic 2 基于 Godot 引擎开发,对 Godot 4.2 及以上版本提供良好支持。其核心功能极为丰富,为开发者打开了创意的大门。它的对话系统堪称一绝,允许开发者创建复杂的对话树。无论是分支剧情、条件判断,还是多角色同时参与的对话,都能轻松实现。想象一下,在角色扮演游戏中,玩家的不同选择通过对话分支引发截然不同的剧情走向,这无疑大大增强了游戏的重玩性与趣味性。

Godot下载地址:

https://godotengine.org/download

对于视觉小说类游戏开发,Dialogic 2 更是得心应手。通过简单直观的拖放操作,开发者就能快速搭建起视觉小说场景,灵活管理背景、角色立绘以及对话框等元素,让文字与画面完美融合,构建出引人入胜的故事世界。此外,它还提供了便捷的角色管理功能,开发者可以方便地设定角色的各项属性、状态和行为,使角色在游戏中更加鲜活立体。

值得一提的是,Dialogic 2 内置了自动更新功能。这意味着开发者无需手动操心繁琐的更新事宜,插件会自动保持在最新版本,及时享受新功能与修复的漏洞,极大地提升了开发效率与稳定性。同时,Dialogic 2 采用单元测试确保代码质量,利用 gdUnit4 测试框架,开发者可在本地运行测试,为代码的可靠性保驾护航。

从应用场景来看,Dialogic 2 的适用性十分广泛。在视觉小说游戏开发中,它能快速构建起整个游戏架构,管理对话、角色和场景,使开发者专注于故事创作。在角色扮演游戏里,其丰富的对话系统可以支持多角色互动,创造出丰富多彩的剧情分支,为玩家带来沉浸式体验。冒险游戏通过它管理对话和角色,增强玩家代入感;教育游戏借助其对话与叙事功能,实现互动式学习体验,寓教于乐。

总的来说,Dialogic 2 以其易于使用的特性、强大的功能、自动化更新以及活跃的开源社区支持,成为游戏开发者打造精彩游戏对话与叙事的不二之选。无论你是经验丰富的行业老手,还是初涉游戏开发领域的新手,Dialogic 2 都能为你的游戏开发之旅增添助力,让你的创意通过精彩的对话与叙事完美呈现。

一、安装与激活​

Dialogic 2 要求 Godot 4.2 或更高版本。确认已安装合适版本后,按以下步骤安装插件:​

  1. 前往Dialogic 官方 GitHub 仓库的 Releases 页面,下载所需版本的 Dialogic 2 压缩包。​
  1. 解压下载的压缩包,找到其中的addons文件夹,该文件夹包含了 Dialogic 插件。​
  1. 将addons文件夹移动到你的 Godot 项目文件夹中。​
  1. 打开 Godot 项目,进入项目>项目设置,点击插件标签页。​
  1. 在插件列表中找到 Dialogic,勾选其旁边的启用按钮。​
  1. 重启 Godot 编辑器,至此 Dialogic 2 插件安装并激活完成。​

Dialogic 2插件下载地址:

https://github.com/dialogic-godot/dialogic/releases

二、认识编辑器界面​

成功安装并激活插件后,在 Godot 编辑器顶部会出现一个新的Dialogic标签页(位于2D、3D、脚本和资源库旁边)。点击进入,映入眼帘的是 Dialogic 主界面。界面顶部能看到 Dialogic 的不同编辑器选项;左侧边栏会展示最近使用过的角色和时间线;右上角有几个常用功能按钮,分别是添加时间线、添加角色、参考管理器和播放时间线 。​

三、创建时间线​

时间线用于编排游戏中的对话流程等事件,创建步骤如下:​

  1. 点击右上角的添加时间线按钮。​
  1. 在弹出窗口中,选择要存放时间线的文件夹,并输入文件名。时间线文件将以.dtl格式保存。​
  1. 点击保存后,编辑器右侧会出现事件面板,可从这里往时间线上添加各种事件。若想了解某个事件及其设置详情,右键点击该事件并选择文档即可查看说明。​
  1. 点击右上角的文本编辑器按钮,可切换到文本编辑模式编写时间线内容。关于文本格式时间线的编写规则,可在相关文档中进一步学习。​
  1. 完成时间线编辑后,点击右上角的播放时间线按钮,可测试当前时间线效果。​

四、创建角色​

为游戏创建角色的步骤如下:​

  1. 点击右上角的添加角色按钮。​
  1. 如同时间线操作,需选择保存角色的位置并命名。角色文件通常以.dchr格式保存。​
  1. 在角色编辑器中,可设置角色的各项属性,如名称、立绘(可添加多个不同表情的立绘)、初始状态等。这些设置将决定角色在对话和游戏场景中的呈现效果。​

五、为游戏添加对话​

  1. 在场景中添加一个Dialogic节点。你可通过在场景树中右键点击,选择添加节点,然后在搜索框中输入Dialogic来找到并添加该节点。​
  1. 选中添加的Dialogic节点,在其属性面板中,从下拉菜单里选择之前创建好的时间线。​
  1. 若要在游戏特定时机触发对话,可通过编写 Godot 脚本实现。例如,在某个场景脚本中添加如下代码,当场景准备好时启动名为ExampleDialog的对话:​
​extends Node2D

func _ready():

Dialogic.start('ExampleDialog')

通过以上步骤,你就能利用 Dialogic 2 插件在 Godot 游戏中搭建起基础的对话系统。随着对插件的深入使用,你还可探索其更多高级功能,如条件判断、多角色同时对话、对话分支剧情等,从而打造出更丰富精彩的游戏体验。

树莓派也能跑Godot了

非官方的,但因为官方开源。所以有人做了这个。好事情,普通2D游戏用它够了。

Unofficial Godot Engine for the Raspberry Pi

https://github.com/hiulit/Unofficial-Godot-Engine-Raspberry-Pi

有兴趣做Godot或Unity开发的请进群。

运行 Godot 游戏在树莓派上需要考虑的事项:

树莓派型号:

树莓派 3B/3B+: 可以运行一些简单的 2D 游戏,但性能可能有限。
树莓派 4/400: 性能更强,可以运行更复杂的 2D 游戏甚至一些轻量级的 3D 游戏。
树莓派 5: 最新型号,拥有更强大的性能,理论上可以运行更多类型的 Godot 游戏。


Godot 版本:

Godot 3.x: 对硬件要求相对较低,可能更适合在较老的树莓派型号上运行。
Godot 4.x: 提供了更多新特性和更好的性能,但在树莓派上可能需要更多的优化。建议使用最新的稳定版本。


操作系统:

推荐使用官方的 Raspberry Pi OS 或其他轻量级的 Linux 发行版。

导出设置:

平台: 选择 Linux/X11 作为导出平台。
架构: 根据你的树莓派型号选择正确的架构 (例如 ARMv7 或 ARM64)。
渲染器: 对于 2D 游戏,Forward+ 渲染器通常可以工作。对于 3D 游戏,可能需要尝试不同的渲染器设置以获得最佳性能。

优化: 启用导出优化选项,例如移除调试符号和压缩资源。
性能优化: 降低分辨率: 在项目设置中降低游戏的默认分辨率可以显著提高性能。
减少资源使用: 优化你的游戏资源,例如使用更小的纹理和更少的多边形。

使用轻量级的脚本: 避免在 _process 函数中进行过于复杂的计算。
考虑使用 GLES2 渲染器 (Godot 3.x): 如果你的游戏是 2D 的,并且在 GLES3 下性能不佳,可以尝试使用 GLES2 渲染器。

输入设备:

确保你的树莓派连接了合适的输入设备,例如键盘、鼠标或游戏手柄。

用树莓派Pico和镍铬丝制作电烙铁

1. 硬件准备

  • 树莓派Pico: 作为控制核心。
  • 镍铬丝: 作为加热元件。
  • MOSFET(如IRF520): 用于控制镍铬丝的电流。
  • 电阻(如220Ω): 用于限制Pico GPIO引脚的电流。
  • 电源: 提供足够的电流和电压。
  • 导线: 耐高温导线。
  • 烙铁头(可选): 可以将铜丝弯曲成烙铁头形状。
  • 隔热材料: 用于包裹镍铬丝,防止烫伤。

2. 硬件连接

  • 将镍铬丝连接到MOSFET的漏极(Drain)。
  • 将MOSFET的源极(Source)连接到GND。
  • 将树莓派Pico的GPIO引脚(例如GPIO15)通过电阻连接到MOSFET的栅极(Gate)。
  • 连接电源到镍铬丝和MOSFET。
  • 将隔热材料包裹在镍铬丝周围。

3. MicroPython编程

  • Thonny IDE: 推荐使用Thonny IDE,方便编写和上传MicroPython代码。
  • GPIO控制: 使用MicroPython的machine库,控制GPIO引脚输出高低电平,控制MOSFET的导通和截止。

示例代码:

from machine import Pin
import time

fire_pin = Pin(15, Pin.OUT)  # 点火引脚,连接到MOSFET栅极

def fire():
    fire_pin.value(1)  # 开启加热
    print("Heating...")

def stop_fire():
    fire_pin.value(0) # 关闭加热
    print("Stop Heating.")

while True:
    input_value = input("Enter '1' to heat, '0' to stop: ")
    if input_value == '1':
        fire()
    elif input_value == '0':
        stop_fire()
    else:
        print("Invalid input.")

4. 安全注意事项

  • 高温风险: 镍铬丝工作时会产生高温,务必小心操作,防止烫伤。
  • 电路安全: 大电流电路存在风险,务必小心操作。
  • 防火措施: 准备灭火器材,防止火灾发生。
  • 测试验证: 在实际焊接前,进行充分的测试验证。
  • 警告:
    • 电烙铁具有一定的危险性,请在安全的环境下操作。
    • 制作和使用电烙铁时,务必遵守相关安全规范。
    • 如果对于电子电路不是十分了解,请勿自行制作。请寻找专业人员的帮助。

5. 补充说明

  • 根据镍铬丝的电阻和电源电压,选择合适的MOSFET。
  • 可以添加温度传感器和PID控制算法,实现温度控制功能。
  • 关于烙铁头的制作:
    • 可以找一段粗的铜丝,然后用锤子敲打铜丝的一端,敲打成扁平状,然后打磨成自己需要的烙铁头形状。
    • 铜具有非常优秀的导热性,所以铜是制作烙铁头的优秀材料。

国内用Gradle构建Android APK

在中国内地,由于网络环境的特殊性,使用Gradle构建Android APK时,经常会遇到依赖下载缓慢或失败的问题。配置SOCKS代理确实是解决这一问题的有效方法之一。以下是一些关于如何为Java和Gradle添加SOCKS代理,以帮助您顺利构建APK的信息:

1. Gradle代理配置

  • gradle.properties文件:
    • 这是配置Gradle代理最常用的方法。您可以在用户主目录下的.gradle文件夹中找到或创建一个gradle.properties文件。
    • 在这个文件中,您可以添加以下属性来配置SOCKS代理:
      • systemProp.socks.proxyHost=your_socks_host
      • systemProp.socks.proxyPort=your_socks_port
      • systemProp.java.net.socks.username=your_socks_username (如果需要)
      • systemProp.java.net.socks.password=your_socks_password (如果需要)
    • 请将your_socks_hostyour_socks_portyour_socks_usernameyour_socks_password替换为您的SOCKS代理服务器的相应信息。
  • 注意事项:
    • 除了SOCKS代理,您可能还需要配置HTTP/HTTPS代理,因为Gradle在某些情况下可能会使用这些协议。
    • nonProxyHosts属性也非常重要,它可以指定不需要通过代理访问的主机。
    • Gradle是以JVM进程启动的,所有和java进程一样,可以提供系统参数,例如-Dproperty=value的形式。

2. Java代理配置

  • 由于Gradle是基于Java的,因此您也可以通过Java系统属性来配置代理。
  • 您可以在启动Gradle时,通过-D参数来设置这些属性。例如:
    • -DsocksProxyHost=your_socks_host
    • -DsocksProxyPort=your_socks_port
  • 但是,通常情况下,在gradle.properties文件中配置代理更为方便。

3. 解决常见问题

  • SOCKS代理与HTTP/HTTPS代理的配合使用:
    • 在某些情况下,您可能需要同时配置SOCKS和HTTP/HTTPS代理,以确保所有依赖项都能正确下载。
  • 代理软件的设置:
    • 确保您的SOCKS代理软件已正确配置,并且可以正常工作。
  • 网络环境的稳定性:
    • 即使配置了代理,不稳定的网络环境也可能导致构建失败。

总结

通过正确配置SOCKS代理,您可以显著提高Gradle在中国内地构建APK的成功率。建议您仔细检查代理设置,并根据您的网络环境进行调整。

DeepSeek近期线上服务受到大规模恶意攻击,注册一度被迫停止

2025年1月28日消息,DeepSeek于服务状态页面公告称:近期DeepSeek线上服务受到大规模恶意攻击,为持续提供服务,暂时限制了+86手机号以外的注册方式,已注册用户可以正常登录,感谢理解和支持。


其实1月27日晚上,即使是国内手机也是注册不进去的。估计是恶意攻击依然在进行中。

1月28日上午,终于注册成功。

有兴趣的朋友可以再试试。

DigitalOcean服务器:便宜可靠的云计算解决方案

在当今数字化时代,选择一个便宜又可靠的云计算服务提供商对于企业和开发者来说至关重要。DigitalOcean作为一家领先的云计算公司,以其高效、稳定和易用的服务赢得了广泛的赞誉。以下是推荐DigitalOcean服务器的几个理由:

高性能和稳定性
DigitalOcean的服务器采用最新的硬件技术,确保高性能和稳定性。无论是运行复杂的应用程序还是处理大量数据,DigitalOcean的服务器都能提供卓越的性能,保证业务的连续性和用户体验的流畅。

简单易用的界面
DigitalOcean提供了一个直观且用户友好的控制面板,使得服务器的管理变得简单。即使是没有太多技术背景的用户,也能轻松上手,快速部署和管理云服务器。

灵活的定价方案
DigitalOcean提供多种定价方案,满足不同用户的需求。最低的套餐6美元一个月。无论是个人开发者、小型企业还是大型企业,都能找到适合自己的方案。同时,DigitalOcean还提供按小时计费的灵活选项,帮助用户更好地控制成本。

丰富的功能和工具
DigitalOcean不仅提供基本的云服务器,还提供了丰富的附加功能和工具,如负载均衡、数据库托管、对象存储等。这些功能可以帮助用户更好地构建和管理自己的应用程序和服务。

强大的社区支持
DigitalOcean拥有一个活跃且热情的社区,用户可以在社区中找到大量的教程、指南和解决方案。而且他们的文档也是非常详细,很适合技术人员学习。此外,DigitalOcean的技术支持团队也非常专业,能够及时解决用户遇到的问题。

结论
总的来说,DigitalOcean以其高性能、易用性、灵活的定价方案和强大的社区支持,成为了云计算市场中的一股清流。无论你是开发者、企业主还是技术爱好者,DigitalOcean都能为你提供可靠的云计算解决方案,助力你的业务发展。

相关地址:

https://m.do.co/c/0a4e09145d2d