相关疑难解决方法(0)

在Python中运行Bash命令

在我的本地机器上,我运行一个包含这一行的python脚本

bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
os.system(bashCommand)
Run Code Online (Sandbox Code Playgroud)

这很好用.

然后我在服务器上运行相同的代码,我收到以下错误消息

'import site' failed; use -v for traceback
Traceback (most recent call last):
File "/usr/bin/cwm", line 48, in <module>
from swap import  diag
ImportError: No module named swap
Run Code Online (Sandbox Code Playgroud)

所以我所做的就是插入一个"print bashCommand",它在使用os.system()运行它之前打印我,而不是终端中的命令.

当然,我再次得到错误(由os.system(bashCommand)引起)但在该错误之前它在终端中打印命令.然后我只是复制了那个输出并在终端上做了一个复制粘贴,然后点击回车就可以了......

有没有人知道发生了什么?

python bash

260
推荐指数
8
解决办法
47万
查看次数

为什么subprocess.Popen参数长度限制小于操作系统报告的限制?

我在Linux 3.16.0上运行Python 3.4.3.我想subprocess.Popen用一个长单个参数(一个复杂的Bash调用)运行一个命令,大约200KiB.

根据getconfxargs,这应该在我的范围内:

$ getconf ARG_MAX
2097152
$ xargs --show-limits < /dev/null
Your environment variables take up 3364 bytes
POSIX upper limit on argument length (this system): 2091740
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2088376
Size of command buffer we are actually using: 131072
Run Code Online (Sandbox Code Playgroud)

但是,Python以极小的限制失败:

>>> subprocess.Popen('echo %s > /dev/null' % ('a' * (131072-4096)), shell=True, executable='/bin/bash')
<subprocess.Popen object at 0x7f4613b58410> …
Run Code Online (Sandbox Code Playgroud)

python linux subprocess command-line-arguments python-3.x

11
推荐指数
1
解决办法
7921
查看次数

"WindowsError:[错误206]文件名或扩展名太长"在使用子进程运行程序很多次之后

我的python程序准备输入,运行外部FORTRAN代码,并在Windows HPC 2008环境中处理输出.它工作得很好,除非代码执行1042-1045次之间的外部程序(通常问题早先收敛).在这些情况下,我得到一个例外:

WindowsError:[错误206]文件名或扩展名太长

但是,文件名的路径不会随着时间增长.它只是清理目录并再次运行.

这是代码:

inpF = open(inName)
outF = open(localOutName,'w')
p = subprocess.Popen(pathToExe,shell=False,stdin=inpF,stdout=outF,cwd=runPath)
stdout, stderr = p.communicate()
outF.close()
inpF.close()
Run Code Online (Sandbox Code Playgroud)

pathToExe是一个指向UNC位置的常量字符串(例如\\ server\shared\program.exe),stdin是本地驱动器上只读模式的打开文件,stdout是本地驱动器上处于写入模式的打开文件和cwd是C:\驱动器上的本地路径.根据这个有点相关的帖子,我已经确认子进程的参数都没有超过80个字符,即使限制应该是32,768 .

我究竟做错了什么?某种程度上积累的东西,只有当我跑了一千次才会成为一个问题.

更新:

为了测试"打开太多文件"这个假设,我做了一个非常小的例子,它使用不同的可执行文件非常快速地运行.这里的主要区别是stdin和stdout在这里只是空文件,而在前一种情况下,它们都是大文件.在这种情况下,代码在2000次运行时运行良好,而早期的运行在~1042处失败.所以它不只是存在那么多文件.也许有太多大文件打开?

import subprocess
for i in range(nRuns):
    if not (i % (nRuns/10.0)):
        print('{0:.2}% complete'.format(i/float(nRuns)*100))
    inpF=open('in.txt')
    outF=open('out.txt','w')
    p = subprocess.Popen('isotxsmerge.exe',shell=False,stdin=inpF,
                                 stdout=outF,cwd='.')
    stdout, stderr = p.communicate()
    outF.close()
    inpF.close()
Run Code Online (Sandbox Code Playgroud)

python windows subprocess hpc

6
推荐指数
1
解决办法
5601
查看次数

Headless LibreOffice 在 Windows 上导出为 PDF 非常慢(比 Linux 慢 6 倍)

我经常需要使用 LibreOffice 将许多(> 1000).docx 文档导出为 PDF。这是一个示例文档:test.docx。以下代码可以工作,但在 Windows 上速度相当慢(每个 PDF 文档平均 3.3 秒):

import subprocess, docx, time   # first do: pip install python-docx 
for i in range(10):
    doc = docx.Document('test.docx')
    for paragraph in doc.paragraphs:
        paragraph.text = paragraph.text.replace('{{num}}', str(i))
    doc.save('test%i.docx' % i)   # these 4 previous lines are super fast - a few ms
    t0 = time.time()
    subprocess.call(r'C:\Program Files\LibreOffice\program\soffice.exe --headless --convert-to pdf test%i.docx --outdir . --nocrashreport --nodefault --nofirststartwizard --nolockcheck --nologo --norestore"' % i)
    print('PDF generated in %.1f sec' % (time.time()-t0)) …
Run Code Online (Sandbox Code Playgroud)

python pdf docx libreoffice

2
推荐指数
1
解决办法
5210
查看次数