python - 我的第一个代码 - 我需要添加错误消息吗?
问题描述
这是我的第一段代码。我正在尝试制作一个可以添加到登录名中的 exe,它将检查 .txt 文件的日期,然后将目录从网络驱动器复制到本地用户。我这样做是因为在 Dynamo(一个 revit 插件)包(类似于 python 模块)中,当它们保存在本地驱动器上时效果最好。我想保持每个人的包相同,以便我的脚本适用于每个人。如果这篇文章对于stackoverflow来说太笼统了,我很抱歉,但我对编码很陌生,因此我有几个问题。到目前为止,该代码对我有用,但在我将它添加到 30 个人的计算机之前,我有点想要一些反馈,这会造成混乱。
我应该为此添加任何错误捕获吗?我已经看到人们使用 try 语句的类似事情。这对这里有帮助吗?
我还读过有人描述了一个 Inno Setup 过程,如果出现某种错误,它将重新创建已删除的目录,这样本地驱动器就不会发生变化。除了将本地目录复制到其他地方并在不需要时删除副本之外,我不知道如何在 python 中执行此操作。这似乎有点愚蠢,因为如果来自网络的副本失败,为什么我会期望一个非常相似的代码可以工作?
此代码很少会实际将目录复制到人们的本地。我只打算在最初的更频繁更改之后每隔几个月更改我们使用的软件包。有没有更好的方法来做到这一点,这样运行的频率就会降低,还是我不应该担心在每次登录时都包含这个?
我通过查看这个使用 Inno Setup 的线程开始了这一点,但我很困惑试图理解发生了什么,并决定尝试 python,我至少学习了几个教程。 https://forum.dynamobim.com/t /distribute-dynamo-in-an-organizational-context/28809
import shutil
import os
# Local standard Packages
# C:/Users/!!!User Name here!!!/AppData/Roaming/Dynamo/DynamoRevit/2.0/packages
# Local Prorubim Nodes
# May need to add later if we start using Dyno for shortcut keys and dynamo script management
# C:/Program Files/Prorubim Nodes
# !!! Temp Location !!! --Change this to the final location before implementing across company.
# X:/Revit/Dynamo Dev Temp 19-02-22/Test Python 19-02-22/Packages
# X:/Revit/Dynamo Dev Temp 19-02-22/Test Python 19-02-22/Packages/JDRM Packages Version.txt
# Gets current user name fix paths below.
import getpass
user_name = getpass.getuser()
print(user_name)
# rmtree delete local
# copytree copies the directory on network
def update_package():
shutil.rmtree("C:/Users/" + user_name + "/AppData/Roaming/Dynamo/Dynamo Revit/2.0/packages")
shutil.copytree("X:/Revit/Dynamo Dev Temp 19-02-22/Test Python 19-02-
22/Packages",
"C:/Users/" + user_name + "/AppData/Roaming/Dynamo/Dynamo
Revit/2.0/packages")
# Checks to see if the version file exists on local drive
version_local_exists = os.path.isfile("C:/Users/" + user_name +
"/AppData/Roaming/Dynamo/Dynamo Revit/2.0/packages/JDRM Packages
Version.txt")
# If version file doesn't exist it runs update_package function. If it does exist then it checks first line for date.
if version_local_exists:
# local version file
version_local_file = open("C:/Users/" + user_name +
"/AppData/Roaming/Dynamo/Dynamo Revit/2.0/packages/JDRM Packages
Version.txt", "r")
version_local_date = version_local_file.read()
version_local_file.close()
# network version file
version_network_file = open("X:/Revit/Dynamo Dev Temp 19-02-22/Test Python
19-02-22/Packages/JDRM Packages Version.txt", "r")
version_network_date = version_network_file.read()
version_network_file.close()
# print for easier checking in python
print(version_local_date)
print(version_network_date)
if version_local_date == version_network_date:
print("Up to date version on local drive.")
else:
update_package()
print("Upgrade has been run.")
else:
update_package()
print("First time install.")
print("C:/Users/" + user_name + "/AppData/Roaming/Dynamo/Dynamo Revit/2.0/packages")
解决方案
我要做的第一件事是删除"C:/Users/" + user_name +
"/AppData/
代码中的行,因为我可以看到这经常导致错误。
相反,我建议使用%AllUsersAppData%
(您可以查看已识别的环境变量以获取更多信息)。
这应该可以让您摆脱将用户名导入代码的需要。
推荐阅读
- yaml - 在 yaml 中定义 Cosmos 合成分区键
- spring-boot - 升级到 gradle 6.6.1(也是 gradle 5)时,bootRepackage 分类器不起作用
- python - 为什么顺序 if 语句仅在满足最后一个条件时才有效?
- html - 从 CSS 中的所有选择器中排除一个类
- javascript - 对象数组的嵌套数组迭代查找所有值搜索过滤器
- python - 队列如何使用线程模型与客户端-服务器一起工作
- firebase - 不根据身份验证状态 Flutter 更改屏幕
- macos - 如何在 Delphi macOS 应用程序中检测暗模式
- python-3.x - 使用递归创建 tkinter 快速乘法游戏
- php - 如何在两张表中使用 laravel WhereIn?