Python可以打开文件,PL/Python可以';T

Python可以打开文件,PL/Python可以';T,python,postgresql,xslt,plpython,Python,Postgresql,Xslt,Plpython,已连接到PostgreSQL中的mydb: mydb=# CREATE FUNCTION file_test () RETURNS text AS $$ if open('mydir/myfile.xsl'): return 'success' $$ LANGUAGE plpythonu; CREATE FUNCTION mydb=# SELECT file_test(); ERROR: IOError: [Errno 2] No such file or directory: 'mydir

已连接到PostgreSQL中的mydb:

mydb=# CREATE FUNCTION file_test () RETURNS text AS $$
if open('mydir/myfile.xsl'): return 'success' 
$$ LANGUAGE plpythonu;
CREATE FUNCTION
mydb=# SELECT file_test();
ERROR:  IOError: [Errno 2] No such file or directory: 'mydir/myfile.xsl'
CONTEXT:  Traceback (most recent call last):
  PL/Python function "file_test", line 2, in <module>
    if open('mydir/myfile.xsl'): return 'success'
PL/Python function "file_test"

绝对路径似乎对PL/Python没有帮助。我想做的是使用Postgres的query_to_xml()并在返回时运行XSLT转换。但要做到这一点,我需要阅读xsl文件…

在@hruske的建议中,我使用了
plpy.notice(os.path.abspath('mydir/myfile.xsl'))
来查看PL/Python是如何解析路径的。它是
/var/lib/postgresql/9.5/main/mydir/myfile.xsl
,这显然不是我想要的

毕竟,这条绝对路径是有效的。将文件复制到更容易键入绝对路径的位置修复了“问题”


为了进一步阅读,我推荐森永崇子的。

如果使用绝对路径呢?这是我的第一个想法。它不起作用。(相应地在上面编辑。)很可能是文件路径不正确,或者您的PostgreSQL进程没有读取此文件的权限。您还可以添加
plpy.notice('Full path:'+os.path.abspath('mydir/myfile.xsl'))
,以查看服务器究竟要访问哪个文件。宾果<代码>注意:/var/lib/postgresql/9.5/main/mydir/myfile.xsl
>>> if open('mydir/myfile.xsl'): print 'success'
... 
success
>>>