Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么重新定位正在运行的exe会使其停止?_Python_Windows_Exe - Fatal编程技术网

Python 为什么重新定位正在运行的exe会使其停止?

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

基本上,我使用PyInstaller将这个python文件转换为可执行文件。 但是从内部重新定位exe的路径会使其停止运行。 从重新定位的路径重新运行可执行文件不会导致任何错误,并且工作正常

使用while True循环主函数可使其保持运行,但无法与服务器建立任何连接。(在代理类中完成)

这是转换为exe的python文件的一部分

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