QuLab 2.7.17__tar.gz → 2.7.19__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qulab-2.7.17 → qulab-2.7.19}/PKG-INFO +1 -1
- {qulab-2.7.17 → qulab-2.7.19}/QuLab.egg-info/PKG-INFO +1 -1
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/load.py +12 -12
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/schedule.py +3 -16
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/storage.py +17 -1
- qulab-2.7.19/qulab/utils.py +95 -0
- qulab-2.7.19/qulab/version.py +1 -0
- qulab-2.7.17/qulab/utils.py +0 -31
- qulab-2.7.17/qulab/version.py +0 -1
- {qulab-2.7.17 → qulab-2.7.19}/LICENSE +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/MANIFEST.in +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/QuLab.egg-info/SOURCES.txt +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/QuLab.egg-info/dependency_links.txt +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/QuLab.egg-info/entry_points.txt +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/QuLab.egg-info/requires.txt +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/QuLab.egg-info/top_level.txt +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/README.md +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/pyproject.toml +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/__main__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/cli/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/cli/commands.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/cli/config.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/dicttree.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/cli.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/template.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/transform.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/executor/utils.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/__main__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/config.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/dataset.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/event_queue.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/mainwindow.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/monitor.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/ploter.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/qt_compat.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/monitor/toolbar.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/curd.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/expression.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/models.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/optimize.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/query.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/record.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/scan.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/server.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/space.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/scan/utils.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/__main__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/backend/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/backend/redis.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/base_dataset.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/chunk.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/dataset.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/file.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/base.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/config.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/file.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/ipy.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/models.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/record.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/report.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/models/tag.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/storage/storage.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/chat.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/device/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/device/basedevice.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/device/loader.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/device/utils.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/drivers/FakeInstrument.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/drivers/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/ipy_events.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/bencoder.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/cli.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/dhcp.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/dhcpd.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/kad.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/kcp.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/net/nginx.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/progress.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/client.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/exceptions.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/msgpack.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/msgpack.pyi +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/router.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/rpc.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/serialize.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/server.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/socket.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/utils.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/worker.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/sys/rpc/zmq_socket.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/tools/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/tools/connection_helper.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/typing.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/__init__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/__main__.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/_autoplot.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/plot_circ.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/plot_layout.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/plot_seq.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/qdat.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/rot3d.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/qulab/visualization/widgets.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/setup.cfg +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/setup.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/src/qulab.h +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/tests/test_kad.py +0 -0
- {qulab-2.7.17 → qulab-2.7.19}/tests/test_scan.py +0 -0
@@ -17,6 +17,7 @@ from .template import (TemplateKeyError, TemplateTypeError, decode_mapping,
|
|
17
17
|
class SetConfigWorkflow():
|
18
18
|
__timeout__ = None
|
19
19
|
__mtime__ = 0
|
20
|
+
__source__ = ''
|
20
21
|
|
21
22
|
def __init__(self, key):
|
22
23
|
self.key = key
|
@@ -309,6 +310,8 @@ def load_workflow_from_file(file_name: str,
|
|
309
310
|
module = module_from_spec(spec)
|
310
311
|
spec.loader.exec_module(module)
|
311
312
|
module.__mtime__ = (base_path / path).stat().st_mtime
|
313
|
+
source_code = (base_path / path).read_text()
|
314
|
+
module.__source__ = source_code
|
312
315
|
|
313
316
|
if hasattr(module, 'entries'):
|
314
317
|
verify_entries(module, base_path)
|
@@ -336,11 +339,11 @@ def load_workflow_from_template(template_path: str,
|
|
336
339
|
path = Path(template_path)
|
337
340
|
|
338
341
|
with open(base_path / path) as f:
|
339
|
-
|
342
|
+
template = f.read()
|
340
343
|
|
341
344
|
mtime = max((base_path / template_path).stat().st_mtime, mtime)
|
342
345
|
|
343
|
-
content, hash_str = inject_mapping(
|
346
|
+
content, hash_str = inject_mapping(template, mapping, str(path))
|
344
347
|
|
345
348
|
if target_path is None:
|
346
349
|
if path.stem == 'template':
|
@@ -354,22 +357,19 @@ def load_workflow_from_template(template_path: str,
|
|
354
357
|
path = target_path
|
355
358
|
|
356
359
|
file = base_path / path
|
357
|
-
if not file.exists():
|
360
|
+
if not file.exists() or file.stat().st_mtime < mtime:
|
358
361
|
file.parent.mkdir(parents=True, exist_ok=True)
|
359
362
|
with open(file, 'w') as f:
|
360
363
|
f.write(content)
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
else:
|
366
|
-
if file.read_text() != content:
|
367
|
-
logger.warning(
|
368
|
-
f"`{file}` already exists and is different from the new one generated from template `{template_path}`"
|
369
|
-
)
|
364
|
+
elif file.read_text() != content:
|
365
|
+
logger.warning(
|
366
|
+
f"`{file}` already exists and is different from the new one generated from template `{template_path}`"
|
367
|
+
)
|
370
368
|
|
371
369
|
module = load_workflow_from_file(str(path), base_path, package)
|
372
370
|
module.__mtime__ = max(mtime, module.__mtime__)
|
371
|
+
if module.__source__ == content:
|
372
|
+
module.__source__ = template, mapping, str(template_path)
|
373
373
|
|
374
374
|
return module
|
375
375
|
|
@@ -70,16 +70,6 @@ def veryfy_analyzed_report(report: Report, script: str, method: str):
|
|
70
70
|
)
|
71
71
|
|
72
72
|
|
73
|
-
def get_source(workflow: WorkflowType, code_path: str | Path) -> str:
|
74
|
-
if isinstance(code_path, str):
|
75
|
-
code_path = Path(code_path)
|
76
|
-
try:
|
77
|
-
with open(code_path / workflow.__workflow_id__, 'r') as f:
|
78
|
-
return f.read()
|
79
|
-
except:
|
80
|
-
return ''
|
81
|
-
|
82
|
-
|
83
73
|
def check_state(workflow: WorkflowType, code_path: str | Path,
|
84
74
|
state_path: str | Path) -> bool:
|
85
75
|
"""
|
@@ -160,8 +150,7 @@ def call_check(workflow: WorkflowType, session_id: str, state_path: Path):
|
|
160
150
|
heads=get_heads(state_path),
|
161
151
|
previous_path=get_head(workflow.__workflow_id__,
|
162
152
|
state_path),
|
163
|
-
script_path=save_item(
|
164
|
-
state_path))
|
153
|
+
script_path=save_item(workflow.__source__, state_path))
|
165
154
|
|
166
155
|
save_report(workflow.__workflow_id__, report, state_path)
|
167
156
|
|
@@ -187,8 +176,7 @@ def call_calibrate(workflow: WorkflowType, session_id: str, state_path: Path):
|
|
187
176
|
heads=get_heads(state_path),
|
188
177
|
previous_path=get_head(workflow.__workflow_id__,
|
189
178
|
state_path),
|
190
|
-
script_path=save_item(
|
191
|
-
state_path))
|
179
|
+
script_path=save_item(workflow.__source__, state_path))
|
192
180
|
|
193
181
|
save_report(workflow.__workflow_id__, report, state_path)
|
194
182
|
|
@@ -286,8 +274,7 @@ def check_data(workflow: WorkflowType, state_path: str | Path, plot: bool,
|
|
286
274
|
heads=get_heads(state_path),
|
287
275
|
previous_path=get_head(workflow.__workflow_id__,
|
288
276
|
state_path),
|
289
|
-
script_path=save_item(
|
290
|
-
state_path))
|
277
|
+
script_path=save_item(workflow.__source__, state_path))
|
291
278
|
report.in_spec = False
|
292
279
|
report.bad_data = False
|
293
280
|
return report
|
@@ -36,6 +36,20 @@ class Report():
|
|
36
36
|
config_path: Path | None = field(default=None, repr=False)
|
37
37
|
script_path: Path | None = field(default=None, repr=False)
|
38
38
|
|
39
|
+
def __getstate__(self):
|
40
|
+
state = self.__dict__.copy()
|
41
|
+
state.pop('base_path')
|
42
|
+
for k in ['path', 'previous_path', 'config_path', 'script_path']:
|
43
|
+
if state[k] is not None:
|
44
|
+
state[k] = str(state[k])
|
45
|
+
return state
|
46
|
+
|
47
|
+
def __setstate__(self, state):
|
48
|
+
for k in ['path', 'previous_path', 'config_path', 'script_path']:
|
49
|
+
if state[k] is not None:
|
50
|
+
state[k] = Path(state[k])
|
51
|
+
self.__dict__.update(state)
|
52
|
+
|
39
53
|
@property
|
40
54
|
def previous(self):
|
41
55
|
if self.previous_path is not None and self.base_path is not None:
|
@@ -84,7 +98,9 @@ class Report():
|
|
84
98
|
@property
|
85
99
|
def script(self):
|
86
100
|
if self.script_path is not None and self.base_path is not None:
|
87
|
-
|
101
|
+
source = load_item(self.script_path, self.base_path)
|
102
|
+
if isinstance(source, str):
|
103
|
+
return source
|
88
104
|
else:
|
89
105
|
return None
|
90
106
|
|
@@ -0,0 +1,95 @@
|
|
1
|
+
import shlex
|
2
|
+
import subprocess
|
3
|
+
import sys
|
4
|
+
import time
|
5
|
+
|
6
|
+
import click
|
7
|
+
|
8
|
+
|
9
|
+
def run_detached(executable_path):
|
10
|
+
"""
|
11
|
+
启动可执行文件并完全分离(优先用 tmux/screen),无需额外终端窗口
|
12
|
+
支持 Windows、Linux 和 macOS
|
13
|
+
"""
|
14
|
+
try:
|
15
|
+
if sys.platform == 'win32' or not _unix_detach_with_tmux_or_screen(
|
16
|
+
executable_path):
|
17
|
+
# 回退到带终端窗口的方案
|
18
|
+
run_detached_with_terminal(executable_path)
|
19
|
+
|
20
|
+
except Exception as e:
|
21
|
+
click.echo(f"启动失败: {e}")
|
22
|
+
sys.exit(1)
|
23
|
+
|
24
|
+
|
25
|
+
def _windows_start(executable_path):
|
26
|
+
"""Windows 弹窗启动方案"""
|
27
|
+
subprocess.Popen(f'start cmd /k "{executable_path}"',
|
28
|
+
shell=True,
|
29
|
+
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
|
30
|
+
|
31
|
+
|
32
|
+
def _unix_detach_with_tmux_or_screen(executable_path):
|
33
|
+
"""Unix 后台分离方案(无窗口)"""
|
34
|
+
safe_path = shlex.quote(executable_path)
|
35
|
+
session_name = f"qulab_{int(time.time())}"
|
36
|
+
|
37
|
+
# 尝试 tmux
|
38
|
+
if _check_command_exists("tmux"):
|
39
|
+
command = [
|
40
|
+
"tmux",
|
41
|
+
"new-session",
|
42
|
+
"-d",
|
43
|
+
"-s",
|
44
|
+
session_name,
|
45
|
+
safe_path + " ; tmux wait-for -S finished", # 等待命令结束
|
46
|
+
";",
|
47
|
+
"tmux",
|
48
|
+
"wait-for",
|
49
|
+
"finished" # 防止进程立即退出
|
50
|
+
]
|
51
|
+
subprocess.Popen(" ".join(command), shell=True, start_new_session=True)
|
52
|
+
click.echo(f"已启动 tmux 会话: {session_name}")
|
53
|
+
click.echo(f"你可以使用 `tmux attach -t {session_name}` 来查看输出")
|
54
|
+
return True
|
55
|
+
|
56
|
+
# 尝试 screen
|
57
|
+
elif _check_command_exists("screen"):
|
58
|
+
command = ["screen", "-dmS", session_name, safe_path]
|
59
|
+
subprocess.Popen(command, start_new_session=True)
|
60
|
+
click.echo(f"已启动 screen 会话: {session_name}")
|
61
|
+
click.echo(f"你可以使用 `screen -r {session_name}` 来查看输出")
|
62
|
+
return True
|
63
|
+
|
64
|
+
return False
|
65
|
+
|
66
|
+
|
67
|
+
def run_detached_with_terminal(executable_path):
|
68
|
+
"""回退到带终端窗口的方案"""
|
69
|
+
safe_path = shlex.quote(executable_path)
|
70
|
+
if sys.platform == 'win32':
|
71
|
+
_windows_start(executable_path)
|
72
|
+
elif sys.platform == 'darwin':
|
73
|
+
script = f'tell app "Terminal" to do script "{safe_path}"'
|
74
|
+
subprocess.Popen(["osascript", "-e", script], start_new_session=True)
|
75
|
+
else:
|
76
|
+
try:
|
77
|
+
subprocess.Popen(["gnome-terminal", "--", "sh", "-c", safe_path],
|
78
|
+
start_new_session=True)
|
79
|
+
except FileNotFoundError:
|
80
|
+
subprocess.Popen(["xterm", "-e", safe_path],
|
81
|
+
start_new_session=True)
|
82
|
+
|
83
|
+
|
84
|
+
def _check_command_exists(cmd):
|
85
|
+
"""检查命令行工具是否存在"""
|
86
|
+
try:
|
87
|
+
subprocess.check_output(["which", cmd], stderr=subprocess.DEVNULL)
|
88
|
+
return True
|
89
|
+
except:
|
90
|
+
return False
|
91
|
+
|
92
|
+
|
93
|
+
# 示例用法
|
94
|
+
if __name__ == '__main__':
|
95
|
+
run_detached("/path/to/your/program")
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "2.7.19"
|
qulab-2.7.17/qulab/utils.py
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
import subprocess
|
2
|
-
import sys
|
3
|
-
|
4
|
-
|
5
|
-
def run_detached_with_terminal(executable_path):
|
6
|
-
"""
|
7
|
-
启动可执行文件并在新终端窗口中保持运行,Python退出后进程仍存在。
|
8
|
-
适用于Windows、Linux和macOS。
|
9
|
-
"""
|
10
|
-
try:
|
11
|
-
if sys.platform == 'win32':
|
12
|
-
# Windows:使用start命令启动新cmd窗口
|
13
|
-
cmd = f'start cmd /k "{executable_path}"'
|
14
|
-
subprocess.Popen(cmd, shell=True)
|
15
|
-
elif sys.platform == 'darwin':
|
16
|
-
# macOS:通过AppleScript在Terminal中执行命令
|
17
|
-
escaped_path = executable_path.replace('"', r'\"')
|
18
|
-
script = f'tell application "Terminal" to do script "{escaped_path}"'
|
19
|
-
subprocess.Popen(['osascript', '-e', script],
|
20
|
-
start_new_session=True)
|
21
|
-
else:
|
22
|
-
# Linux:尝试gnome-terminal或xterm
|
23
|
-
try:
|
24
|
-
subprocess.Popen(['gnome-terminal', '--', executable_path],
|
25
|
-
start_new_session=True)
|
26
|
-
except FileNotFoundError:
|
27
|
-
subprocess.Popen(['xterm', '-e', executable_path],
|
28
|
-
start_new_session=True)
|
29
|
-
except Exception as e:
|
30
|
-
print(f"启动失败: {e}")
|
31
|
-
sys.exit(1)
|
qulab-2.7.17/qulab/version.py
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "2.7.17"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|