Python 为什么重新定位正在运行的exe会使其停止?
基本上,我使用PyInstaller将这个python文件转换为可执行文件。 但是从内部重新定位exe的路径会使其停止运行。 从重新定位的路径重新运行可执行文件不会导致任何错误,并且工作正常 使用while True循环主函数可使其保持运行,但无法与服务器建立任何连接。(在代理类中完成) 这是转换为exe的python文件的一部分Python 为什么重新定位正在运行的exe会使其停止?,python,windows,exe,Python,Windows,Exe,基本上,我使用PyInstaller将这个python文件转换为可执行文件。 但是从内部重新定位exe的路径会使其停止运行。 从重新定位的路径重新运行可执行文件不会导致任何错误,并且工作正常 使用while True循环主函数可使其保持运行,但无法与服务器建立任何连接。(在代理类中完成) 这是转换为exe的python文件的一部分 def main(): try: # try to relocate file (always works) root_pa
def main():
try:
# try to relocate file (always works)
root_path = os.environ["HOMEPATH"]
file_name = os.path.basename(sys.executable)
current_path = os.path.realpath(sys.executable)[2:]
path_needed = os.path.join(root_path, file_name)
if current_path != path_needed:
print(str(current_path) + " != " + str(path_needed))
os.rename(current_path, path_needed)
except Exception as e:
print("main exception with exception " + str(e))
agent = Agent()
agent.run()
if __name__ == "__main__":
# while True:
main()
通过再次调用exe文件解决了这个问题(并且只允许当前文件关闭)
请解释你为什么投反对票。(没有投反对票)你的问题是关于(你的)操作系统如何工作,而不是关于编程。听起来像Windows BTW。感谢您的澄清@KlausD。工作目录中的工作驱动器可能与可执行文件路径不同。我们无法控制初始工作目录。这是由执行程序的人设置的。因此后续的
rename
调用可能会失败。此外,它可能是以“\\server\share”或“\\?\”开头的UNC或设备路径,因此修剪前两个字符通常是无效的。用户的主目录是“%HOMEDRIVE%%HOMEPATH%”
。不要假设主驱动器为“C:”。更好的是,不要使用这个变量组合。这是不可靠的。在某些上下文中,例如通过runas.exe或任务调度器运行,它最终设置为“%SystemRoot%\System32”。配置文件目录“%USERPROFILE%”
是可靠的,如果没有为用户明确设置主目录,则它是默认的主目录。如果主目录是“System32”目录,则至少要返回配置文件目录。执行程序的调用方可能正在等待它并检查退出代码。您可以使用类似于sys.exit(subprocess.call(path_needed))
的方法,这样您就可以等待新实例并代理退出代码。更好的是,当您重新定位未打包的可执行文件时,找出PyInstaller的冻结可执行文件启动器退出的原因。显然,它正在监视解包的可执行文件,或者监视解包的临时目录,如果认为文件已被删除,则退出。也许这是某种隐式清理策略的一部分。
if current_path != path_needed:
print(str(current_path) + " != " + str(path_needed))
os.rename(current_path, path_needed)
try:
os.startfile("C:\\" + path_needed)
except Exception as exception:
print("main execute exception with exception " + str(exception))
return