- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将文本字符串写入文件供 c 程序读取。
一个 Python 程序如何启动一个 c 程序并向它传递一个 ~2K(文本)数据结构?
另请注意,我不能使用“subprocess.check_output()”。我必须使用“os.system()”。那是因为后者允许我的 c 程序直接访问终端输入/输出。前者没有。
1 Câu trả lời
您可以将其作为参数传递,只需……将其作为参数传递即可。大概您想引用它而不是将其作为需要转义的任意数量的参数传递等等,但这很容易 shlex.quote
.例如:
with open('bigfile.txt', 'rb') as infile:
biginput = infile.read(2048)
os.system('cprogram {}'.format(shlex.quote(biginput)))
如果您收到有关参数的错误或命令行对于 shell 而言太长……那么您将无法执行此操作。 Python 不能让 shell 做它不能做的事情,而你拒绝绕过 shell(我认为是因为误解,但我们暂时忽略它)。因此,您将需要一些其他方式来传递数据。
但这并不意味着您必须将其存储在文件中。您可以使用来自 subprocess
的 shell就像来自 os.system
一样容易,这意味着您可以将其传递给子进程的标准输入:
with subprocess.Popen('cprogram {}'.format(shlex.quote(biginput)),
shell=True, stdin=subprocess.PIPE) as p:
p.communicate(biginput)
由于您使用的是 shell=True
, 而不是替换 đầu ra chuẩn
hoặc stderr
, 它将获得与 os.system
完全相同的终端.所以,例如,如果它正在做,比如说,isatty(fileno(stdout))
,如果您的 Python 脚本在 tty 中运行,则为 true,否则为 false。
作为旁注,将其存储在 tempfile.NamedTemporaryFile
中可能不会花费您预期的那么多。特别是,子进程可能能够直接从内存磁盘缓存中读取您写入的数据,而不是等待它被刷新到磁盘(并且它可能永远不会被刷新到磁盘)。
我怀疑你认为你不能使用 subprocess
的原因是你用的是kiểm tra_đầu ra
当你想要的时候check_call
.
如果您使用 kiểm tra_đầu ra
(或者如果您将 stdout=PIPE
显式传递给大多数其他 subprocess
函数),子进程的标准输出是您正在读取的管道,因此它显然不是 tty。
这是有道理的:要么你想捕获输出,在这种情况下 C 程序不能输出到 tty,要么你想让 C 程序输出到 tty,在这种情况下你不能捕获it.* 所以,只要不捕获输出,一切都会好起来的。
如果我是对的,这意味着您一开始就没有理由使用 shell,这让一切都变得简单多了。当然,您的数据可能仍然大于最大系统参数大小** 或资源限制***,即使没有 shell。在大多数现代系统上,您至少可以指望 64KB,所以一定要先尝试一下:
subprocess.check_call(['cprogram', biginput])
但是如果你得到一个E2BIG
错误:
with subprocess.Popen(['cprogram', biginput], stdin=subprocess.PIPE) as p:
p.communicate(biginput)
* 当然,除非您想为您的子进程伪造 tty,在这种情况下您需要查看 os.forkpty
和相关功能,或 pty
模块。
** 在大多数 *BSD 和相关系统上,sysctl kern.argmax
和/或 getconf ARG_MAX
会给你系统限制,或者sysconf(_SC_ARG_MAX)
来自 C。可能还有一个常量 ARG_MAX
vượt qua
访问.在 Linux 上,事情有点复杂,因为有许多不同的限制(其中大部分非常非常高),而不是只有一个限制。查看您平台的联机帮助页以获取 execve
了解详情。
*** 在一些平台上,包括最近的 linux,RLIMIT_STACK
影响您可以传递的最大参数大小。再次,查看您平台的 execve
联机帮助页。
关于python - 在 Linux 中从 Python 启动一个 c 程序,将一个大文本字符串作为参数传递给 c 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18003154/
Tôi cần đặt văn bản vào một Div, vào một Div khác, vào một Div khác nữa. Vậy thì trông nó như thế này: #document Thay đổi mã PIN
Một điều kỳ lạ đã xảy ra. Tôi có một mã HTML cơ bản. html, đầu, thân. (Vì tôi nhận được một số phiếu bầu không tốt, đây là mã đầy đủ) Đây là CSS của tôi: html { background
Tôi đang cố gắng tải một tập hợp hình ảnh từ Assets vào ImageView có trong UICollectionview nhưng bất cứ khi nào tôi chạy ứng dụng, nó đều hiển thị lỗi. Và cũng không có hình ảnh nào được hiển thị. Tôi đang sử dụng
Tôi cần thay đổi một số biến môi trường dựa trên đầu ra của tập lệnh perl có tham số. Trong tcsh, tôi có thể sử dụng lệnh bí danh để đánh giá đầu ra của một tập lệnh perl. tcsh: bí danh setsdk 'eval `/localhome/
Tôi đã tạo một ứng dụng Blazor (phía máy chủ) mới bằng Windows Authentication và chạy nó bằng IIS Express. Nó sẽ hiển thị thông báo "Xin chào Domain\User!" ở góc trên bên phải sau Ra
Đây là phương thức void login(Event event); của tôi. Tôi muốn biết cách thực hiện điều này trong Kotlin. Câu trả lời hay nhất Trong Kotlin, toán tử đại diện là *. Nó hướng dẫn trình biên dịch rằng nó không được biết đến, nhưng một khi nó được biết đến, không có lớp nào khác
Xem mã sau cho câu chuyện trong sách nếu story.title.length < 140 - var story
Tôi đang cố gắng học cách xử lý chuỗi trong C. Tôi đã viết một chương trình lưu trữ một số bản nhạc và giúp người dùng kiểm tra xem bài hát mà họ đang nghĩ đến có tồn tại trong số các bản nhạc đã lưu trữ hay không. Điều này được thực hiện bằng cách yêu cầu người dùng nhập một chuỗi ký tự. Chương trình sau đó sử dụng strstr()
Tôi đang học sscanf và thấy một chuỗi định dạng như thế này: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); Tôi hiểu phần %[^:] có nghĩa là quét cho đến khi gặp ':' và gán nó cho a. :
def char_check(x,y): nếu (str(x) trong y hoặc x.find(y) > -1) hoặc (str(y) trong x hoặc y.find(x) > -1):
Tôi có một tình huống muốn đưa các dòng hiện có từ một tệp văn bản vào một khối mới. dòng 1 dòng 2 dòng trong khối dòng 3 dòng 4 phải trở thành dòng 1 dòng 2 dòng
Tôi có một dự án mới và đang cố gắng thiết lập thanh công cụ gỡ lỗi Django. Đầu tiên, tôi thử thiết lập nhanh, chỉ cần thêm 'debug_toolbar' vào danh sách các ứng dụng đã cài đặt. Với điều này, khi tôi đi đến URL gốc của mình, gỡ lỗi
Trong Matlab, nếu tôi có một hàm f, với chữ ký f(a,b,c), tôi có thể tạo một hàm chỉ có một biến b sẽ gọi f với a=a1 và c=c1 cố định: g = @(b) f(a1, b,
Tôi không hiểu tại sao lại có khoảng cách dọc bổ sung giữa các phần tử trong ForEach bên trong VStack để hiển thị bộ chia ngang tùy chỉnh khi sử dụng GeometryReader bên trong ScrollView. Cuộn
Tôi tự hỏi, có hướng dẫn hoặc biện pháp tốt nhất nào về thời điểm sử dụng phiên và cookie không? Những gì nên và không nên lưu trữ trong đó? Cảm ơn! Câu trả lời hay nhất Các tài liệu này cung cấp hiểu biết tốt về các vấn đề bảo mật của cookie phiên và
Tôi có một ma trận Nx3 trong scipy/numpy mà tôi muốn tạo một biểu đồ thanh 3 chiều, trong đó trục X và Y được xác định bởi các giá trị ở cột thứ nhất và thứ hai của ma trận, chiều cao của mỗi thanh là cột thứ ba trong ma trận và số thanh được xác định bởi N.
Giả sử tôi khởi tạo semaphore theo hai cách khác nhau sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) Bây giờ, sem_wait(&randomsem) trong cả hai trường hợp
Tôi đang nghi ngờ cách giá trị được lưu trữ trong "WORD" vì PStr chứa đầu ra thực tế. ? Vì Pstr lưu trữ các chữ cái viết thường thành chữ hoa, làm sao để chuyển nó thành "WORD" trong printf? Có ai vui lòng giúp tôi được không? Bạn có thể giải thích được không? #bao gồm
Tôi có một mảng 3x3: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; và muốn lấy 2 phần tử đầu tiên
Tôi nhận ra bạn có thể dễ dàng kiểm tra tiêu điểm bằng cách sử dụng lệnh sau: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(window
Tôi là một lập trình viên xuất sắc, rất giỏi!