Hướng dẫn pass python variable to bash - chuyển biến python sang bash

Làm thế nào tôi sẽ chuyển một biến Python cho vỏ bash? Nó sẽ hoạt động như thế này: foo="./RetVar.py 42"

Thay thế các tài liệu kép bằng `s

Tôi đã thử in và sys. Exex kết quả, nhưng không có kết quả. Làm thế nào tôi sẽ hoàn thành mục tiêu của mình?

Khi được hỏi ngày 9 tháng 5 năm 2010 lúc 7:20May 9, 2010 at 7:20

Hướng dẫn pass python variable to bash - chuyển biến python sang bash

foo="$(scriptthatprintssomething)"

Đó là nó.

foo="$(python scriptthatprintssomething.py)"
0. Hoặc
foo="$(python scriptthatprintssomething.py)"
1. Hoặc những thứ tương tự. Nếu tập lệnh không thể thực thi thì bạn sẽ cần chỉ định trình thông dịch một cách rõ ràng.

foo="$(python scriptthatprintssomething.py)"

Đã trả lời ngày 9 tháng 5 năm 2010 lúc 7:22May 9, 2010 at 7:22

Trong bash, cả `` cmd

foo="$(python scriptthatprintssomething.py)"
2 và $ (CMD) sẽ được thay thế bằng đầu ra của lệnh. Điều này cho phép bạn gán đầu ra của chương trình cho một biến như

foo=`some command`

hoặc

foo=$(some command)

Thông thường bạn bọc điều này trong các trích dẫn kép để bạn có thể có khoảng trắng trong đầu ra của mình. Nó phải là trích dẫn gấp đôi vì những thứ bên trong trích dẫn đơn sẽ không được thực thi.

Đã trả lời ngày 9 tháng 5 năm 2010 lúc 18:31May 9, 2010 at 18:31

Seamusseamusseamus

4453 Huy hiệu bạc5 Huy hiệu Đồng3 silver badges5 bronze badges

Hình thức mong muốn của bạn hoạt động tốt:

$ cat >Retvar.py
#!/usr/bin/python
import sys
print sys.argv[1]
$ chmod +x RetVar.py 
$ foo=`./RetVar.py 42`
$ echo $foo
42
$ 

Vì vậy, có lẽ những cách mà bạn đã thử in là không chính xác. . Nếu bạn vẫn gặp vấn đề này, bạn có thể cho chúng tôi xem ví dụ tối thiểu về mã Python tái tạo nó, để giúp chúng tôi giúp bạn không?

Đã trả lời ngày 9 tháng 5 năm 2010 lúc 14:22May 9, 2010 at 14:22

Alex Martellialex MartelliAlex Martelli

830K165 Huy hiệu vàng1205 Huy hiệu bạc1385 Huy hiệu Đồng165 gold badges1205 silver badges1385 bronze badges

Không. Đó không phải là cách sử dụng mô -đun

foo="$(python scriptthatprintssomething.py)"
4 và ví dụ đó sẽ không hoạt động.

Một trong những mục tiêu của mô -đun

foo="$(python scriptthatprintssomething.py)"
4 là tránh sử dụng shell để phân tích đối số khi thực hiện các quá trình con, trái ngược với cách những thứ như
foo="$(python scriptthatprintssomething.py)"
6 hoạt động buộc phải xảy ra. Các thói quen khác nhau trong mô -đun
foo="$(python scriptthatprintssomething.py)"
4 theo mặc định không sử dụng shell và mong đợi một chuỗi (danh sách hoặc tuple) của các đối số đã được chia, để chương trình có thể trực tiếp chia tách. Tránh vỏ cho công việc này là an toàn và nhanh hơn.

Nếu

foo="$(python scriptthatprintssomething.py)"
9 có bộ bit thực thi và bắt đầu bằng một dòng hashbang hợp lệ, thì cách thích hợp để gọi đó là:

arg = ...
subprocess.call(['./test.sh', arg])

Nếu

foo="$(python scriptthatprintssomething.py)"
9 thiếu bit thực thi hoặc không có dòng hashbang, thì đây là cách thích hợp:

arg = ...
subprocess.call(['sh', 'test.sh', arg])

(Bạn có thể thay thế

foo=`some command`
1 nếu tập lệnh sử dụng các tính năng dành riêng cho BASH.)

Trong cả hai trường hợp, các đối số được đưa ra như một chuỗi và không nên sử dụng

foo=`some command`
2. Điều đó chỉ đánh bại toàn bộ mục đích của việc sử dụng
foo="$(python scriptthatprintssomething.py)"
4. (Và nếu bạn chỉ định
foo=`some command`
2, bạn phải cung cấp các đối số dưới dạng một chuỗi, không phải là một chuỗi.)not be used. That just defeats the whole purpose of using
foo="$(python scriptthatprintssomething.py)"
4. (And if you do specify
foo=`some command`
2, you must provide the arguments as a single string, not as a sequence.)

Tôi có mã Python hiện có và tôi cần gọi một tập lệnh bash từ bên trong.Mã Python nắm bắt được một vài biến và tôi cần điều này được chuyển đến vỏ của tôi để tránh đầu vào trùng lặp từ người dùng.

Tôi đã tạo một tập lệnh kiểm tra để mô phỏng điều này, tuy nhiên, tôi không thể lặp lại các biến trong shell (nó trả lại một null)

1): Có thể chuyển biến Python cho tập lệnh shell được gọi là bằng cách sử dụng quy trình con không?2) Nếu mã dưới đây có thể được tối ưu hóa để đạt được điều này, tôi sẽ mở để phản hồi.

Mã Python:

import os
import subprocess

first=input("Enter the first ip")
second=input("Enter the second IP")

subprocess.call(['bash','./script.sh',first,second])

Mã bash (script.sh):

#!/bin/bash
###########################
echo "The First IP is $first"
echo "Enter your server "
read faulty_server
echo "The server is $faulty_server"