IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python新进程启动程序无法移植?你可能需要一个跨平台的程序启动框架>_(Python编程 | 系统编程 | 并行系统工具 | 一个跨平台的程序启动框架) -> 正文阅读

[Python知识库]Python新进程启动程序无法移植?你可能需要一个跨平台的程序启动框架>_(Python编程 | 系统编程 | 并行系统工具 | 一个跨平台的程序启动框架)

我要学习

一个跨平台的程序启动框架

示例:my_PP4E/launchmodes.py

#!/usr/bin/env python
"""
##############################################################################
用命令行和可复用的启动方案来启动Python程序;在命令行开头自动向Python可执行文件插入"python"
或路径;这个模块的某个部分可能假定Python在你的系统路径中。

使用subprocess模块也行,不过os.popen在内部调用这个模块,目标是在这里启动一个独立运行的程序
,而非连接到它的流;multiprocessing模块也是一个选择,不过这里处理命令行而非函数,为实现这里
的选项之一而开始一个进程不是很合理。
##############################################################################
"""

import sys
import os

PYFILE = (sys.platform[:3] == 'win' and 'python.exe') or 'python'
# and 和 or 运算
# 判断变量是否为0, 是0则为False,非0判断为True,
# and中含0,返回0; 均为非0时,返回后一个值, 
# 2 and 0   # 返回0
# 2 and 1   # 返回1
# 1 and 2   # 返回2

# or中, 至少有一个非0时,返回第一个非0,
# 2 or 0   # 返回2
# 2 or 1   # 返回2
# 0 or 1   # 返回1 
PYPATH = sys.executable


def fixWindowsPath(cmdline):
	"""
	将cmdline开头的脚本文件名路径中所有'/'改为'\\';在Windows下,仅为运行需要处理这种
	工具的类所使用;在其他平台上,这么做也没有坏处
	"""
	splitline = cmdline.lstrip().split(' ')  # 在空格处分割字符串
	fixedpath = os.path.normpath(splitline[0])  # 解决斜杠问题
	return ' '.join([fixedpath] + splitline[1:])  # 把路径重新拼起来


class LaunchMode:
	"""
	在实例中待命,声明标签并运行命令;子类按照run方法中的需要格式化命令行;命令应当以准
	备运行的Python脚本名开头,而且不带“python”或脚本的完整路径。
	"""

	def __init__(self, label, command):
		self.what = label
		self.where = command

	def __call__(self):  # 等待调用,执行按钮按下的回调工作
		self.announce(self.what)
		self.run(self.where)  # 子类必须定义run

	def announce(self, text):  # 子类可以重新定义announce
		print(text)  # 用方法代替if、elif逻辑

	def run(self, cmdline):
		assert False, 'run must be defined'


class System(LaunchMode):
	"""
	运行shell命令行中指定的Python脚本;小心,可能会阻塞调用者,除非在Unix下带上&操
	作符。
	"""

	def run(self, cmdline):
		cmdline = fixWindowsPath(cmdline)
		os.system('{} {}'.format(PYPATH, cmdline))


class Popen(LaunchMode):
	"""
	在新进程中运行shell命令行;小心,可能会阻塞其调用者,因为管道闭得太快
	"""

	def run(self, cmdline):
		cmdline = fixWindowsPath(cmdline)
		os.popen(PYPATH + ' ' + cmdline)  # 假设没有数据可以进行读取


class Fork(LaunchMode):
	"""
	在显示地创建新进程中运行命令,仅在类Unix系统下可用,包括Cygwin
	"""

	def run(self, cmdline):
		assert hasattr(os, 'fork'), 'platform not supported'
		cmdline = cmdline.split()  # 把字符串转换为列表
		if os.fork() == 0:  # 开始新的子进程
			os.execvp(PYPATH, [PYFILE] + cmdline)  # 在子进程中运行新程序


class Start(LaunchMode):
	"""
	独立于调用者运行程序;仅在Windows下可用:使用了文件名关联
	"""

	def run(self, cmdline):
		assert sys.platform[:3] == 'win', 'platform not supported'
		cmdline = fixWindowsPath(cmdline)
		os.startfile(cmdline)


class StartArgs(LaunchMode):
	"""
	仅在Windows下可用:args可能需要用到真正的start命令;斜杠在这里没问题。
	"""

	def run(self, cmdline):
		assert sys.platform[:3] == 'win', 'platform not supported'
		os.system('start ' + cmdline)  # 可能会创建弹出窗口


class Spawn(LaunchMode):
	"""
	在独立于调用者的新进程中运行Python;在Windows和Unix下都可用;DOS中使用
	P_NOWAIT;斜杠在这里没问题。
	"""

	def run(self, cmdline):
		os.spawnv(os.P_DETACH, PYPATH, (PYPATH, cmdline))


class Top_level(LaunchMode):
	"""
	在新窗口中运行,进程是同一个;待讨论:还需要GUI类信息。
	"""

	def run(self, cmdline):
		assert False, 'Sorry - mode not yet implemented'


#############################
# 为这个平台挑选一个最佳的启动器 #
# 可能需要在其他地方细化这个选项 #
#############################

if sys.platform[:3] == 'win':
	PortableLauncher = Spawn
else:
	PortableLauncher = Fork


class QuietPortableLauncher(PortableLauncher):
	"""
	不通知安静地用平台适用的方式启动程序
	"""
	
	def announce(self, text):
		pass


def selftest():
	file = 'echo.py'
	input('default mode...')
	PortableLauncher(file, file)()  # 不阻塞

	input('system mode...')
	System(file, file)()  # 阻塞

	if sys.platform[:3] == 'win':
		input('DOS start mode...')
		StartArgs(file, file)()  #不阻塞


if __name__ == '__main__':
	selftest()

示例:my_PP4E/echo.py

#!/usr/bin/env python
"测试"

print('Spam')
input('press Enter')

输出:my_PP4E/launchmodes.py

default mode...
echo.py
system mode...Spam
press Enter
echo.py
Spam
press Enter

———————————————————————————————————————————

😃 学完博客后,是不是有所启发呢?如果对此还有疑问,欢迎在评论区留言哦。
如果还想了解更多的信息,欢迎大佬们关注我哦,也可以查看我的个人博客网站BeacherHou

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:29:40  更:2021-08-15 15:31:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:08:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码