1
1
import asyncio
2
2
import os
3
3
import pwd
4
+ import sys
5
+ from typing import Any , Optional
4
6
5
7
from openhands .runtime .base import CommandResult
6
8
7
9
8
10
class AsyncBashSession :
9
11
@staticmethod
10
12
async def execute (
11
- command : str , work_dir : str , username : str | None = None
13
+ command : str , work_dir : str , username : Optional [ str ] = None
12
14
) -> CommandResult :
13
15
"""Execute a command in the bash session asynchronously."""
14
16
work_dir = os .path .abspath (work_dir )
@@ -20,24 +22,31 @@ async def execute(
20
22
if not command :
21
23
return CommandResult (content = '' , exit_code = 0 )
22
24
23
- env = {}
24
- if username :
25
+ # Create subprocess arguments
26
+ subprocess_kwargs : dict [str , Any ] = {
27
+ 'stdout' : asyncio .subprocess .PIPE ,
28
+ 'stderr' : asyncio .subprocess .PIPE ,
29
+ 'cwd' : work_dir ,
30
+ }
31
+
32
+ # Only apply user-specific settings on non-Windows platforms
33
+ if username and sys .platform != 'win32' :
25
34
try :
26
35
user_info = pwd .getpwnam (username )
27
- env ['HOME' ] = user_info .pw_dir
28
- env ['USER' ] = username
29
- env ['LOGNAME' ] = username
36
+ env : dict [str , str ] = {
37
+ 'HOME' : user_info .pw_dir ,
38
+ 'USER' : username ,
39
+ 'LOGNAME' : username ,
40
+ }
41
+ subprocess_kwargs ['env' ] = env
42
+ subprocess_kwargs ['user' ] = username
30
43
except KeyError :
31
44
raise ValueError (f'User { username } does not exist.' )
45
+
32
46
# Prepare to run the command
33
47
try :
34
48
process = await asyncio .subprocess .create_subprocess_shell (
35
- command ,
36
- stdout = asyncio .subprocess .PIPE ,
37
- stderr = asyncio .subprocess .PIPE ,
38
- cwd = work_dir ,
39
- user = username ,
40
- env = env ,
49
+ command , ** subprocess_kwargs
41
50
)
42
51
43
52
try :
0 commit comments