bị hỏng Popen("source the_script.sh")
tương đương với Popen(["source the_script.sh"])
mà cố gắng không thành công để khởi động chương trình 'source the_script.sh'
. Nó không thể tìm thấy nó, do đó lỗi "No such file or directory"
.
bị hỏng Popen("source the_script.sh", shell=True)
thất bại vì source
là một lệnh dựng sẵn bash (loại help source
trong bash) nhưng vỏ mặc định là /bin/sh
mà không hiểu nó (/bin/sh
sử dụng .
). Giả sử có thể có khác bash-ism trong the_script.sh
, nó phải được chạy bằng bash:
foo = Popen("source the_script.sh", shell=True, executable="/bin/bash")
Như @IfLoop said, nó không phải là rất hữu ích để thực hiện source
trong một tiến trình con bởi vì nó không thể ảnh hưởng đến môi trường của cha mẹ.
os.environ.update(env)
phương pháp dựa trên không thành công nếu the_script.sh
thực thi unset
đối với một số biến. os.environ.clear()
có thể được gọi để thiết lập lại môi trường:
#!/usr/bin/env python
import os
from pprint import pprint
from subprocess import check_output
os.environ['a'] = 'a'*100
# POSIX: name shall not contain '=', value doesn't contain '\0'
output = check_output("source the_script.sh; env -0", shell=True,
executable="/bin/bash")
# replace env
os.environ.clear()
os.environ.update(line.partition('=')[::2] for line in output.split('\0'))
pprint(dict(os.environ)) #NOTE: only `export`ed envvars here
Nó sử dụng env -0
and .split('\0')
suggested by @unutbu
Để hỗ trợ byte tùy ý trong os.environb
, json
mô-đun có thể được sử dụng (giả sử chúng tôi sử dụng phiên bản Python nơi "json.dumps not parsable by json.loads" issue là cố định):
Để tránh truyền môi trường qua đường ống, mã Python có thể được thay đổi để tự gọi trong môi trường xử lý con, ví dụ:
#!/usr/bin/env python
import os
import sys
from pipes import quote
from pprint import pprint
if "--child" in sys.argv: # executed in the child environment
pprint(dict(os.environ))
else:
python, script = quote(sys.executable), quote(sys.argv[0])
os.execl("/bin/bash", "/bin/bash", "-c",
"source the_script.sh; %s %s --child" % (python, script))
Có thể trùng lặp của [Emulating Bash 'nguồn' trong Python] (https://stackoverflow.com/questions/3503719/emulating-bash-source-in-python) – sds